ural 1297 Palindrome

求一个串的最长回文子串

把原串的反串加个原串后面,中间加个没有出现过的字符

然后,原串中,下标i在反串中对应的位置为2*l-i

如果求以i为对称轴的回文串,我们求suffix(i)和suffix(2*l-i)的LCP

如果求以i和i+1为对称轴的回文串,我们求suffix(i+1)和suffix(2*l-i)的LCP

画下就知道了


代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
const int MAX=2010;
int wa[MAX],wb[MAX],wv[MAX],wn[MAX],a[MAX],sa[MAX];  
char s[MAX];
int cmp(int* r,int a,int b,int l)  
{  
    return r[a]==r[b]&&r[a+l]==r[b+l];  
}  
void DA(char* r,int* sa,int n,int m)  
{  
    int i,j,p,*x=wa,*y=wb,*t;  
    for(i=0; i=0; i--)sa[--wn[x[i]]]=i;  
    for(j=1,p=1; p=j)y[p++]=sa[i]-j;
        for(i=0; i=0; i--)sa[--wn[wv[i]]]=y[i];  
        for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1; ir)
		swap(l,r);
	l++;
	//cout<<"l="<


你可能感兴趣的:(字符串)