在昨天多校的凸包被卡之后,我已经发现用poj测模板是作死的最好方式。
所以又水了两道。
ural 1297. Palindrome
这里要求输出回文串。
理解一下模板len[i]的含义。
当i是偶数,len[i]表示的是i/2位置为中心的奇数长度回文串的回文串半长((回文串长度+1)/2);
当i是奇数,len[i]表示的是i/2、i/2+1为中心的偶数长度回文串的回文串半长。
hdu 3068 最长回文
所以又水了两道。
ural 1297. Palindrome
这里要求输出回文串。
理解一下模板len[i]的含义。
当i是偶数,len[i]表示的是i/2位置为中心的奇数长度回文串的回文串半长((回文串长度+1)/2);
当i是奇数,len[i]表示的是i/2、i/2+1为中心的偶数长度回文串的回文串半长。
然后输出就简单了。
模板还有一个坑点,len[n<<1-1]也是不可用的。最后一个字符偶数长度的回文串长肯定是0。所以不要用到它就行。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define Maxn 2001000
char s[Maxn];
int len[Maxn];
int manacher(char str[],int len[],int n,int &ll,int &rr){
len[0]=1;
int i,j,p,q,r;
for(i=1,j=0;i<(n<<1)-1;++i){
p=i>>1;q=i-p;r=((j+1)>>1)+len[j]-1;
len[i]=r<q?0:min(r-q+1,len[(j<<1)-i]);
while(p>len[i]-1&&q+len[i]<n&&str[p-len[i]]==str[q+len[i]])
++len[i];
if (q+len[i]-1>r) j=i;
}
int tmp,pos;
int ma=0;
for(i=0;i<(n<<1)-1;++i){//-1 !
if (i&1) tmp=len[i]<<1;
else tmp=(len[i]<<1)-1;
if (tmp>ma) {
ma=tmp;
if (i&1) {ll=(i>>1)+1-len[i];rr=(i>>1)+len[i];}
else {ll=(i>>1)+1-len[i];rr=(i>>1)+len[i]-1;}
}
//printf("%d %d\n",i,len[i]);
}
return ma;
}
int main(){
int cas=0;
int ol,tmp,ma,l,i,pos,rr,ll;
while(scanf("%s",s)!=EOF){
l=strlen(s);
manacher(s,len,l,ll,rr);
for(i=ll;i<=rr;++i){
printf("%c",s[i]);
}
printf("\n");
}
return 0;
}
hdu 3068 最长回文
这个没啥好说的,就是输出最长回文串长度。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define Maxn 221000
char s[Maxn];
int len[Maxn];
int manacher(char str[],int len[],int n,int &ll,int &rr){
len[0]=1;
int i,j,p,q,r;
for(i=1,j=0;i<(n<<1)-1;++i){
p=i>>1;q=i-p;r=((j+1)>>1)+len[j]-1;
len[i]=r<q?0:min(r-q+1,len[(j<<1)-i]);
while(p>len[i]-1&&q+len[i]<n&&str[p-len[i]]==str[q+len[i]])
++len[i];
if (q+len[i]-1>r) j=i;
}
int tmp,pos;
int ma=0;
for(i=0;i<(n<<1)-1;++i){//-1 !
if (i&1) tmp=len[i]<<1;
else tmp=(len[i]<<1)-1;
if (tmp>ma) {
ma=tmp;
if (i&1) {ll=(i>>1)+1-len[i];rr=(i>>1)+len[i];}
else {ll=(i>>1)+1-len[i];rr=(i>>1)+len[i]-1;}
}
}
return ma;
}
int main(){
int cas=0;
int ol,tmp,ma,l,i,pos,rr,ll;
while(scanf("%s",s)!=EOF){
l=strlen(s);
ma=manacher(s,len,l,ll,rr);
printf("%d\n",ma);
}
return 0;
}