(福建工程大ACM程序设计复盘)I题周期串

本文介绍了一道签到题的解决方法,题目要求判断能否将给定字符串重组为K个相同的子串,并输出字典序最小的一组。通过使用哈希表记录字符频率,实现高效判断与输出。

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;
}

 

转载于:https://www.cnblogs.com/mlcn-2000/p/10102603.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值