1355: [Baltic2009]Radio Transmission
Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 627 Solved: 417
[ Submit][ Status][ Discuss]
Description
Input
Output
Sample Input
cabcabca
Sample Output
HINT
对于样例,我们可以利用"abc"不断自我连接得到"abcabcabc",读入的cabcabca,是它的子串
解题思路:KMP。答案为len(总长)-next[len](末尾对应的值)
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
int n,len;
char s[1000010];
int fa[1000011];
inline int read()
{
char y; int x=0,f=1; y=getchar();
while (y<'0' || y>'9') {if (y=='-') f=-1; y=getchar();}
while (y>='0' && y<='9') {x=x*10+int(y)-48; y=getchar();}
return x*f;
}
void KMP()
{
fa[0]=0;
for (int i=1;i<=len;++i)
{
int u=fa[i-1];
while (u && s[i]!=s[u+1]) u=fa[u];
if (s[i]==s[u+1]&&i!=u+1) fa[i]=u+1;
else fa[i]=0;
}
}
int main()
{
n=read();
scanf("%s",s+1);
len=strlen(s+1);
KMP();
int ans=len-fa[len];
printf("%d",ans);
}