A

来源:互联网 发布:怎样快速提升淘宝心 编辑:程序博客网 时间:2024/05/29 11:41

点击打开链接

得到next的两种形式

由-1开始

void getnext(char *t, int m) {    int i = 0, j = 0;    next[0] = -1; j = next[i];    while(i < m) {        if(j == -1 || t[i] == t[j]) {            next[++i] = ++j;        }        else {            j = next[j];        }    }}
由0开始

void getnext1(char *a,int n){int i=1,j=0;next1[0]=0;j=next1[i-1];while(i<n){while(j>0&&a[i]!=a[j])j=next1[j-1];if(a[i]==a[j])++j;next1[i]=j;i++;}}

Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc" and b = "def" then a*b = "abcdef". If we think of concatenation as multiplication, exponentiation by a non-negative integer is defined in the normal way: a^0 = "" (the empty string) and a^(n+1) = a*(a^n).
Input
Each test case is a line of input representing s, a string of printable characters. The length of s will be at least 1 and will not exceed 1 million characters. A line containing a period follows the last test case.
Output
For each s you should print the largest n such that s = a^n for some string a.
Sample Input
abcdaaaaababab.
Sample Output
143
Hint
This problem has huge input, use scanf instead of cin to avoid time limit exceed.

题解:

用KMP算法求出next数组后,找到最后一个0的位置,这个就是最短的数结束循环的位置。然后输出 l / (endd + 1) 然后就光荣的wa了。

原因是没有考虑特殊情况,例子:ABABA,输出应该是1,但是按上面的会输出2。所以我们还要判断一下 l 是否能整除 (endd + 1) ,如果不能就输出1。

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;char a[1000005];int next1[1000005];void getnext1(char *a,int n){int i=1,j=0;next1[0]=0;j=next1[i-1];while(i<n){while(j>0&&a[i]!=a[j])j=next1[j-1];if(a[i]==a[j])++j;next1[i]=j;i++;}}int main(){while(1){    scanf("%s",a);if(a[0]=='.')break;int l1=strlen(a);int ans=0;getnext1(a,l1);//for(int i=0;i<l1;i++)//printf("%d ",next1[i]);//printf("\n");for(int i=l1-1;i>=0;i--){            if(next1[i]==0)            {            if(l1%(i+1)==0)            {            ans=l1/(i+1);break;}else{ans=1;break;}}}printf("%d\n",ans);}return 0;}





原创粉丝点击