(福建工程大ACM程序设计复盘)I题周期串
I题//链接:https://ac.nowcoder.com/acm/contest/289/I
//因为毒瘤出题人出的题都太难了,于是gugugu打算出一个签到题,(就是这题啦),这题很简单,给定一个字符串,请问你重新排序后能不能组成K个相同的字符串。
//输入描述:
//多组数据输入,第一行输入k表示需要k个相同的字符串个数,第二行给出指定的字符串s。字符串长度l (1≤ k ≤ l ≤ 100)
//输入的字符串仅由小写字母组成
//输出描述:
//对于每组数据输出一行:
//如果能组成k个相同的字符串,就输出重新组合后的字符串,(输出重复子串字典序最小的那一组),否则输出-1
//思路:利用hash表的下标存储每个字符出现的次数,可以做到输出的回文串的单位串是字典序最小而不需要用排序,
// 其次对于长度为n的字符串,若能组成k个相同串,则每个相同串的长度为n/k,字符串中每个字符在一个相同串中出现的次数为i/k
// 利用这个思路打hash表,之后依次从hash表中用两层循环,第一层循环n/k次,第二层是每个字符串出现的次数i/k。(注意,若不考虑相同串有序,则相同串有(n/k)^(n/k)种可能 )
具体代码如下:
#include <iostream> #include <cmath> #include <string> #include <cstring> using namespace std; int ans[200]; int main() { int k; while(cin>>k) { string v1; cin>>v1; memset(ans,0,sizeof(ans)); for(int i=0;i<v1.size();i++) ans[v1[i]]++; int flag=1; for(int i='a';i<='z';i++) { if(ans[i]%k) { flag=0; break; } else ans[i]/=k; } if(!flag) cout<<"-1"<<endl; else{ for(int i=1;i<=k;i++) for(int j='a';j<='z';++j) for(int p=0;p<ans[j];++p) cout<<(char)j; cout<<endl; } } return 0; }