考虑KMP的失配fail指针
指向的显然是离自己最近的相同串。。有点难以表达
举个例子:
abcabcabc
a
b
c
a
b
c
a
b
c
那么最后一个
c
c
就指向前一个的下一个,匹配成这样:
abcabcab|c|
a
b
c
a
b
c
a
b
|
c
|
(原串)
abcab|c|abc
a
b
c
a
b
|
c
|
a
b
c
这样这题最小循环不就是跳到
nxt[len+1]
n
x
t
[
l
e
n
+
1
]
吗!
#include<bits/stdc++.h>
#define gt() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++)
#define __R register
#define isletter(ch) (ch>='a'&&ch<='z')
using namespace std;
static char buf[1000000],*p1=buf,*p2=buf;
const int maxn=(1e6)+5;
int n,nxt[maxn];char s[maxn];
int main(){
scanf("%d",&n);
char ch=gt();while(!isletter(ch)) ch=gt();
for(__R int i=0;i<n;i++,ch=gt()) s[i]=ch;
__R int j=0,k=-1;nxt[0]=-1;
while(j<n) if(k==-1||s[j]==s[k]) nxt[++j]=++k;else k=nxt[k];
printf("%d\n",n-nxt[n]);
return 0;
}