字符串(一)Locklink2026-04-09 模板, 算法竞赛 KMPint main(){ cin>>s1; cin>>s2; int n=strlen(s1); int m=strlen(s2); nxt[0]=0; int j=0; for(int i=1;i<m;i++){ while(j>0&&s2[i]!=s2[j])j=nxt[j]; if(s2[i]==s2[j]){ j++; } nxt[i+1]=j; } j=0; for(int i=0;i<n;i++){ while(j>0&&s1[i]!=s2[j])j=nxt[j]; if(s1[i]==s2[j]){ j++; } if(j==m){ cout<<i-m+2<<endl; } } for(int i=1;i<=m;i++){ cout<<nxt[i]<<" "; } cout<<endl; return 0;} manacher// d[i]: 以位置 i 为中心的最长回文串的半径长度s+='#';for(int i=0;i<ss.size();i++){ s+=ss[i]; s+='#';}int n=s.size();for(int i=0,l=0,r=-1;i<n;i++){ int k=(i>r)?1:min(d[l+r-i],r-i+1); while(0<=i-k&&i+k<n&&s[i-k]==s[i+k])k++; d[i]=k--; if(i+k>r){ l=i-k; r=i+k; } ans=max(ans,d[i]-1);} Trieint ch[N][26],tot;bool bo[N];void insert(char *s){ int len=strlen(s); int u=0; for(int i=0;i<len;i++){ int c=s[i]-'a'; if(ch[u][c]==-1){ ch[u][c]=++tot; } u=ch[u][c]; } bo[u]=true;}bool find(char *s){ int len=strlen(s); int u=1; for(int i=0;i<len;i++){ int c=s[i]-'a'; if(ch[u][c]==-1)return false; u=ch[u][c]; } return true;}int main(){ memset(ch,-1,sizeof(ch));}