Codeforces---k-String

原文链接: http://codeforces.com/problemset/problem/219/A


A. k-String

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
代码一:
#include<iostream>
#include<memory.h>
#include<string.h>
using namespace std;
int main()
{
	int k;
	char str[1001];
	int count[26];
	while(cin>>k>>str)
	{
		int g=0;
		memset(count,0,sizeof(count));
		//用count数组存储每个字母出现的个数
		for(int i=0; i<strlen(str); i++)
			count[str[i]-'a']++;
		//如果出现其中有一个字母的个数不是k的整数倍个,那么肯定不符合题意,即g=1
		for(int j=0; j<26; j++)
		{
			if(count[j]!=0 && count[j]%k!=0)
				g=1;
		}
		//g!=1说明测试例所给的字符串是符合规则的,否则不符合输出-1
		if(g!=1)
		{
			for(int i=0; i<k; i++)
			{
				for(int j=0; j<26; j++)
				{
					int len = count[j]/k;
					if(count[j]!=0)
					{
						while(len--)
							cout<<(char)(j+'a');
					}
				}
			}
			cout<<endl;
		}
		else
			cout<<"-1"<<endl;
	}
	return 0;
}


代码二:
#include<iostream>
#include<string>
#include<memory>
#include<vector>
#include<algorithm>
using namespace std;

struct ch
{
	int num;
	char c;
};

vector<ch>v;
vector<int>v1;
int main()
{
	int n;
	string a;
	while(cin>>n>>a)
	{
		sort(a.begin(),a.end());
		if(n==1)
		{
			cout<<a<<endl;
			continue;
		}
		v.clear();
		v1.clear();
		int L=a.length();
		for(int i=0;i<L;i++)
		{
			bool flag=false;
			for(int k=0;k<v.size();k++)
			{
				if(v[k].c==a[i])
				{
					v[k].num++;
					flag=true;
					break;
				}
			}
			if(flag==false)
			{
				ch cc;
				cc.c=a[i];
				cc.num=1;
				v.push_back(cc);
			}
		}
		int j;
		int s=v.size();
		for(j=0;j<v.size();j++)
		{
			int r=v[j].num%n;
			int r1=v[j].num/n;
			v1.push_back(r1);
			if(r!=0)
				break;
		}
		if(j!=s)
		{
			cout<<-1<<endl;
			continue;
		}
		else
		{
			for(int t=0;t<n;t++)
			{
				for(int j=0;j<v.size();j++)
				{
					for(int k=0;k<v1[j];k++)
						cout<<v[j].c;
				}
			}
			cout<<endl;
		}
	}
}








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值