poj2406的题解君。。

大家好~ 我是一个题解吐舌头。。。。

我是主人的处女作。。。求不喷委屈。。。

http://poj.org/problem?id=2406 题目链接在此。。

题意:字符串相乘等于字符串连接。。。。给你一个串s,求出最大的使某个字符串a满足 a^n=s....

所以。。kmp生成s的next数组后,从数组后面寻找重复的周期。。。。即用长度减去最后一位的匹配数,得到可能的周期,考察可能的周期与总长度的关系,如果能整除,则证明周期的合法性,输出。。。否则无周期,即s就是a,那么n就是1.。。

代码如下:

#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1100000;
int next[maxn];
char word[maxn];
int len;
void get_next()
{
    int i=-1,j=0;
    next[0]=-1;
    while(j<len)
    {
        if(i==-1||word[i]==word[j])
        {
            i++;
            j++;


            next[j]=i;
        }
        else i=next[i];
    }
}
int main()
{
    while(1)
    {
        scanf("%s",word);
        if(strcmp(word,".")==0)
            break;
//        printf("%s",word);
        len=strlen(word);
        get_next();
        //printf("1\n");
        int i;
//        for(i=0;i<len;i++)
//        {
//            printf("%d ",next[i]);
//            printf("\n");
//        }
        if(len%(len-next[len]))
            printf("1\n");
        else printf("%d\n",len/(len-next[len]));
    }
    return 0;
}

手残不会调试。。。只能用万能的输出语句。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值