char a[maxn]; int p[maxn]; //manacher void manacher(char *s){ int len = strlen(s+1); int m = 2*len+1; for(int i=1; i<=len; i++){ a[i<<1] = s[i]; a[i<<1|1] = ‘#‘; } a[0] = ‘+‘; a[1] = ‘#‘; a[m+1] = ‘-‘; // cout<<a<<endl; int mx=0, idx;for(int i=1; i<=m; i++) { if(mx > i) p[i] = min(p[2*idx-i], mx-i); else p[i] = 1; for(; a[i-p[i]]==a[i+p[i]]; p[i]++); if(p[i]+i > mx) mx = p[i]+i, idx=i; }// for(int i=1; i<=m; i++) // cout<<p[i]<<‘ ‘; // cout<<endl; }
使用的时候应该注意s的下标从1开始。
时间: 2024-11-08 14:15:56