(福建工程大ACM程序設計覆盤)I題週期串

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;
}
相關文章
相關標籤/搜索