【模板】基础字符串算法--马拉车,烤馍片(KMP),最小表示法
一些很基础的的字符串算法模板(不予解释)
烤馍片(KMP)
void kmp()//烤馍片 { fail[1]=j=0; for(int i=2;i<=m;i++) { while(j>0&&b[i]!=b[j+1]) j=fail[j]; if(b[i]==b[j+1]) j++; fail[i]=j; } j=0; for(int i=1;i<=n;i++) { while(j>0&&a[i]!=b[j+1]) j=fail[j]; if(a[i]==b[j+1]) j++; if(j==m) { printf("%d ",i-j+1); j=fail[j]; } } }最小表示法(MinShow)
void MinShow//最小表示法 { int i=0; int j=1; cin>>s; L=s.size(); s=s+s; int k; while(i<L&&j<L) { for(k=0;k<L;k++) if(s[i+k]!=s[j+k]) break; if(k==L) break; if(s[i+k]>s[j+k]) i=i+k+1; else j=j+k+1; if(i==j) j++; } printf("%d",min(i,j)); }马拉车(manacher)
void manacher()//马拉车 { int mx=0,p=0; int ans=0; for(int i=1;i<len;i++) { if(i<mx) r = min(mx-i+1,r[p*2-i]); else r=1; while(a[i+r[i]]==a[i-r[i]]) r[i]++; if(i+r[i]-1>mx) { mx=i+r[i]-1; p=i; } ans=max(ans,r[i]-1); } }