poj 2406 Power Strings(KMP)

来源:互联网 发布:mac 怎么恢复u盘的文件 编辑:程序博客网 时间:2024/05/01 00:44

题目链接:

http://poj.org/problem?id=2406

题目大意:

给出一个字符串,这个字符串一定能够以a^n表示。现在问n最大为多少。

思路:

对于这个字符串来说,我可以算出他的next数组,然后能够得到这整个字符串的最大前缀和后缀相同的值next[len]。然后可以发现len-next[len]就是这个a的长度。所以就自己猜了一下= =如果len%(len-next[len])==0,就是len/(len-next[len])。否则就是1。

代码:

#include<stdio.h>#include<string.h>#include<algorithm>#include<iostream>using namespace std;int min(int a,int b){    return a>b?a:b;}int next[1050005]; char s[1050005];void GetNext(char* p,int next[],int l){   // memset(next,0,sizeof(next));    int pLen = l;    next[0] = -1;    int k = -1;    int j = 0;    while (j < pLen )    {        //p[k]表示前缀,p[j]表示后缀        if (k == -1 || p[j] == p[k])        {            ++j;            ++k;            next[j] = k;        }        else        {            k = next[k];        }    }}int main(){    while(scanf("%s",s)!=EOF)    {        memset(ans,0,sizeof(ans));     if(s[0]=='.')break;        int x;     int  l=strlen(s);       x=l;      GetNext(s,next,x);      x=x-next[x];            if(l%x==0)      printf("%d\n",l/x);    else printf("1\n");    }     return 0;}


0 0
原创粉丝点击