I題//連接:https://ac.nowcoder.com/acm/contest/289/Iios
//由於毒瘤出題人出的題都太難了,因而gugugu打算出一個簽到題,(就是這題啦),這題很簡單,給定一個字符串,請問你從新排序後能不能組成K個相同的字符串。spa
//輸入描述:code
//多組數據輸入,第一行輸入k表示須要k個相同的字符串個數,第二行給出指定的字符串s。字符串長度l (1≤ k ≤ l ≤ 100)blog
//輸入的字符串僅由小寫字母組成排序
//輸出描述:ci
//對於每組數據輸出一行:字符串
//若是能組成k個相同的字符串,就輸出從新組合後的字符串,(輸出重複子串字典序最小的那一組),不然輸出-1 get
//思路:利用hash表的下標存儲每一個字符出現的次數,能夠作到輸出的迴文串的單位串是字典序最小而不須要用排序,string
// 其次對於長度爲n的字符串,若能組成k個相同串,則每一個相同串的長度爲n/k,字符串中每一個字符在一個相同串中出現的次數爲i/khash
// 利用這個思路打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; }