得到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).
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.
For each s you should print the largest n such that s = a^n for some string a.
abcd aaaa ababab .
1 4 3
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;
}