KMP模版
int i,j;
for(Next[1]=j=0,i=2;s2[i];i++){
while(j&&s2[i]!=s2[j+1]){
j=Next[j];
}
if(s2[i]==s2[j+1]){
j++;
}
Next[i]=j;
}
for(int i=1,j=0;s1[i];i++){
while(j&&s1[i]!=s2[j+1]){
j=Next[j];
}
if(s1[i]==s2[j+1]){
j++;
}
if(!s2[j+1]){
j=Next[j];
}
}
KMP算法字符串匹配
#include<bits/stdc++.h>
using namespace std;
int Next[1000005];
int main(){
string s1,s2;
cin>>s1;
cin>>s2;
s1=" "+s1;
s2=" "+s2;
int i,j;
for(Next[1]=j=0,i=2;s2[i];i++){
while(j&&s2[i]!=s2[j+1]){
j=Next[j];
}
if(s2[i]==s2[j+1]){
j++;
}
Next[i]=j;
}
for(int i=1,j=0;s1[i];i++){
while(j&&s1[i]!=s2[j+1]){
j=Next[j];
}
if(s1[i]==s2[j+1]){
j++;
}
if(!s2[j+1]){
j=Next[j];
cout<<i-s2.size()+2<<"\n";
}
}
for(int i=1;i<s2.size();i++){
cout<<Next[i]<<" ";
}
return 0;
}
剪布条
#include<bits/stdc++.h>
using namespace std;
int Next[1000005];
int main(){
string s1,s2;
while(1){
cin>>s1;
if(s1=="#"){
break;
}
cin>>s2;
s1=" "+s1;
s2=" "+s2;
int i,j,ans=0;
for(Next[1]=j=0,i=2;s2[i];i++){
while(j&&s2[i]!=s2[j+1]){
j=Next[j];
}
if(s2[i]==s2[j+1]){
j++;
}
Next[i]=j;
}
for(int i=1,j=0;s1[i];i++){
while(j&&s1[i]!=s2[j+1]){
j=Next[j];
}
if(s1[i]==s2[j+1]){
j++;
}
if(!s2[j+1]){
j=0;
ans++;
}
}
cout<<ans<<"\n";
}
return 0;
}
字符串最大值
#include<bits/stdc++.h>
using namespace std;
int maxx=-0x3f3f3f3f,cnt[100005];
int Next[100005];
int main(){
string s;
getline(cin,s);
s=" "+s;
int i,j;
for(Next[1]=j=0,i=2;s[i];i++){
while(j&&s[i]!=s[j+1]){
j=Next[j];
}
if(s[i]==s[j+1]){
j++;
}
Next[i]=j;
}
for(int i=1;i<s.size();i++){
cnt[i]=1;
}
for(int i=s.size()-1;i>=1;i--){
cnt[Next[i]]+=cnt[i];
}
for(int i=1;i<s.size()-1;i++){
maxx=max(maxx,cnt[i]*i);
}
cout<<maxx;
return 0;
}