(福建工程大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;
}

 

posted @ 2018-12-11 15:42  龙刃已准备出鞘  阅读(169)  评论(0编辑  收藏  举报