马拉车——模版+KMP——模版
void Manacher(){ for (int i=0;t[i];++i,len+=2){ s[i<<1]='#'; if (t[i]>='A'&&t[i]<='Z') s[i<<1|1]=t[i]-'A'+'a'; else s[i<<1|1]=t[i]; } s[len++]='#'; int max_r=0,pos=0; for (int i=0;i<len;++i){ if (max_r>i) r[i]=min(max_r-i,r[2*pos-i]); else r[i]=0; while (i+r[i]+1<len&&i-r[i]-1>=0&&s[i+r[i]+1]==s[i-r[i]-1]) r[i]++; if (r[i]+i>max_r){ max_r=r[i]+i; pos=i; } } } //马拉车
#define N 1010 char s[N],p[N]; int nxt[N]; void get_nxt(char * p){ int i=0,j=-1; nxt[i]=j; while (p[i]){ if (j==-1||p[j]==p[i]) nxt[++i]=++j; else j=nxt[j]; } } int kmp(char *s,char *p){ get_nxt(p); int i=0,j=0,ret=0; for (;s[i];++i){ while (j!=-1&&s[i]!=p[j]) j=nxt[j]; j++; if (!p[j]){ ret++; j=next[j]; //operations } } return ret; } int main(){ scanf("%s%s",s,p); printf("%d\n",kmp(s,p)); return 0; }
//KMP算法
我博客里有大量的从别的博客复制过来的代码,分析,以及理解,但我一律会在文章后面标记原博客大佬博客名,其中部分会加以连接。
绝无抄袭的意思,只是为了我在复习的时候找博客方便。
如有原作者对此有不满,请在博客留言,我一定会删除该博文。