Codeforces Round #135 (Div. 2)---A. k-String

time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

A string is called a k-string if it can be represented as k concatenated copies of some string. For example, the string "aabaabaabaab" is at the same time a 1-string, a 2-string and a 4-string, but it is not a 3-string, a 5-string, or a 6-string and so on. Obviously any string is a 1-string.

You are given a string s, consisting of lowercase English letters and a positive integer k. Your task is to reorder the letters in the string sin such a way that the resulting string is a k-string.

Input

The first input line contains integer k (1 ≤ k ≤ 1000). The second line contains s, all characters in s are lowercase English letters. The string length s satisfies the inequality 1 ≤ |s| ≤ 1000, where |s| is the length of string s.

Output

Rearrange the letters in string s in such a way that the result is a k-string. Print the result on a single output line. If there are multiple solutions, print any of them.

If the solution doesn't exist, print "-1" (without quotes).

Sample test(s)
input
2
aazz
output
azaz
input
3
abcabcabz
output
-1





解题思路:给一个串。问能否由k个同样的串连接而成。

用STL里的map。扫一遍。分别记录每一个字符的个数。在推断全部的字符是否是k的倍数,若不是,则输出-1;否则,遍历依次map。每一个字符输出(总个数)/k个,然后反复k次就可以。





AC代码:

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
#define INF 0x7fffffff

map<char, int> m;

int main()
{
    #ifdef sxk
        freopen("in.txt","r",stdin);
    #endif
    int n;
    string s;
    while(scanf("%d",&n)!=EOF)
    {
        cin>>s;
        int len = s.size();
        for(int i=0; i<len; i++)
            m[s[i]] ++;
       map<char, int>::iterator it;
       int flag = 1;
        for(it=m.begin(); it!=m.end(); it++){
            if(it->second % n){
                flag = 0;
                break;
            }
        }
        if(!flag)  printf("-1
");
        else{
            for(int j=0; j<n; j++){
                for(it=m.begin(); it!=m.end(); it++){
                    for(int i=1; i<=it->second/n; i++)
                        printf("%c", it->first);
                }
            }
            printf("
");
        }
    }
    return 0;
}


原文地址:https://www.cnblogs.com/mthoutai/p/6867404.html