字符串
KMP模板
P3375【模板】KMP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int nxt[N];
string s,p;
void solve(){
cin>>s>>p;
int ls=s.size(),lp=p.size();
s=" "+s;
p=" "+p;
for(int i=2,j=0;i<=lp;i++){
while(j&&p[i]!=p[j+1])j=nxt[j];
if(p[i]==p[j+1])j++;
nxt[i]=j;
}
for(int i=1,j=0;i<=ls;i++){
while(j&&s[i]!=p[j+1])j=nxt[j];
if(s[i]==p[j+1])j++;
if(j==lp){
cout<<i-lp+1<<"\n";
j=nxt[j];
}
}
for(int i=1;i<=lp;i++)cout<<nxt[i]<<" ";
}
P4391无线传输
求最小循环串,即n-nxt[n]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int nxt[N];
string p;
void solve(){
int n;
cin>>n;
cin>>p;
int lp=p.size();
p=" "+p;
int mn=1e9;
for(int i=2,j=0;i<=lp;i++){
while(j&&p[i]!=p[j+1])j=nxt[j];
if(p[i]==p[j+1])j++;
nxt[i]=j;
mn=min(mn,i-nxt[i]);
}
//for(int i=1;i<=n;i++)cout<<nxt[i]<<" ";
cout<<n-nxt[n];
}
This post is licensed under CC BY 4.0 by the author.