一种简单的寻找回文子串的算法。可以在O(N)的时间复杂度内,求出以每个字母为对称中心的回文子串。
属于奇技淫巧?回文串的题很少啊。 我们还有后缀数组求回文子串的方法,可以做到
定义一些符号:
原串:
将
我们接下来还要再定义两个数字,即:
对于
裸题。 (也没什么好题了)
#include <stdio.h>#define M 110010char b[M],a[M<<1];int p[M<<1];#define min(a,b) ((a)<(b)?a:b)#define max(a,b) ((a)>(b)?a:b)int main() { int i,n,id,MaxL,MaxId; while(scanf("%s",b+1)!=EOF) { MaxL=MaxId=0; for(i=1;b[i]!='/0';i++) { a[i<<1]=b[i]; a[(i<<1)+1]='#'; } a[0]='?',a[1]='#'; n=(i<<1)+2,a[n]=0; for(i=1;i<n;i++) { if(MaxId>i) p[i]=min(p[2*id-i],MaxId-i); else p[i]=1; while(a[i+p[i]]==a[i-p[i]]) p[i]++; if(p[i]+i>MaxId) { MaxId=p[i]+i; id=i; } MaxL=max(MaxL,p[i]); } PRintf("%d/n",MaxL-1); } }新闻热点
疑难解答