ural1297 Palindrome,hdu 3068 最长回文,Manacher
来源:互联网 发布:浙大宁波软件学院 编辑:程序博客网 时间:2024/06/03 07:51
在昨天多校的凸包被卡之后,我已经发现用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 2001000char 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 221000char 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;}
0 0
- ural1297 Palindrome,hdu 3068 最长回文,Manacher
- hdu 3068 最长回文 manacher
- HDU 3068 最长回文 Manacher
- hdu 3068 最长回文(manacher)
- HDU 3068 最长回文 // Manacher
- HDU 3068 最长回文 Manacher
- HDU 3068 最长回文(Manacher)
- 【HDU 3068】 最长回文|manacher
- HDU - 3068 最长回文(manacher)
- hdu 3068 最长回文(manacher)
- HDU 3068 最长回文 Manacher
- hdu 3068 最长回文 (manacher)
- HDU 3068(最长回文-manacher)[Template:manacher]
- 【URAL1297】Palindrome【Manacher】
- HDU 3068 最长回文 [Manacher回文串]
- HDU3068 URAL1297 Manacher求最长回文子串
- hdu 3068 最长回文(manacher&最长回文子串)
- hdu 3068 最长回文(最长回文子串 manacher算法)
- 经过测试hbase常用命令
- 快娱全新改版 招商全面起航
- JS实现AJAX提交数据到后台,实现验证用户名是否存在功能详解
- 小谈php的垃圾回收机制
- Serializable 解释
- ural1297 Palindrome,hdu 3068 最长回文,Manacher
- CareerCup 递归与动态规划 Q9.10 最大高度堆箱子
- Storm 实战:构建大数据实时计算
- iOS archive(归档)的总结
- 安装redis
- Flex TextInput 动态判断输入内容
- 关于Cocos2dx屏幕适配
- ios 隐藏状态栏
- 关于ETL过程(1)