hdu3068&&hdu3294,回文串,Manacher算法
来源:互联网 发布:hfss读取matlab的数据 编辑:程序博客网 时间:2024/04/29 15:40
关于Manacher算法讲解在这
在o(n)时间内算出以每个点为中心的最大回文串长度
hdu3068
模板题
#include<cstdio>#include<string>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int N=233333;//20Wint Manacher(string st){ int len=st.size(); int *p=new int[len+1]; memset(p,0,sizeof(p)); int mx=0,id=0; for (int i=1;i<=len;i++){ if (mx>i)p[i]=min(p[2*id-i],mx-i); else p[i]=1; while (st[i+p[i]]==st[i-p[i]])p[i]++; if (i+p[i]>mx){mx=i+p[i];id=i;} } int ma=0; for(int i=1;i<len;i++)ma=max(ma,p[i]); delete(p); return ma-1;}int main(){ //freopen("fuck.in","r",stdin); char st[N]; while (~scanf("%s",st)){ string st0="$#"; for (int i=0;st[i]!='\0';i++){ st0+=st[i]; st0+="#"; } printf("%d\n",Manacher(st0)); } return 0;}
hdu3294
最后输出的时候稍微处理一下就好
#include<map>#include<cstdio>#include<string>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int N=200400;string ans;int _start,_end;int Manacher(string st){ int len=st.size(); int *p=new int[len+1]; memset(p,0,sizeof(p)); int mx=0,id=0; for (int i=1;i<=len;i++){ if (mx>i)p[i]=min(p[id*2-i],mx-i); else p[i]=1; while (st[i+p[i]]==st[i-p[i]])p[i]++; if (i+p[i]>mx)mx=i+p[i],id=i; } int ma=0,ii; for (int i=1;i<len;i++) if (p[i]>ma)ma=p[i],ii=i; ma--; _start=((ii-ma+1)>>1)-1; _end =((ii+ma-1)>>1)-1; ans=""; for (int i=ii-ma;i<=ii+ma;i++) if (st[i]!='#')ans+=st[i]; delete(p); return ma;}void writeln(char ch,string st){ char tag='a'-1; map<char,char>t; for (char i=ch;i<='z';i++)t[i]=++tag; for (char i='a';i< ch;i++)t[i]=++tag; int len=st.size(); printf("%d %d\n",_start,_end); for (int i=0;i<len;i++)printf("%c",t[st[i]]); puts("");}int main(){ char ch,st[N]; while (~scanf("%c %s\n",&ch,st)){ string st0="$#"; for (int i=0;st[i]!='\0';i++) {st0+=st[i];st0+="#";} if (Manacher(st0)==1)puts("No solution!"); else writeln(ch,ans); } return 0;}
明天高数月考,,,,求rp++
0 0
- hdu3068&&hdu3294,回文串,Manacher算法
- hdu3068+hdu3294 最长回文字符串的manacher算法
- hdu3068回文串Manacher算法
- HDU3068(最长回文子串manacher算法)
- HDU3068-manacher算法-最长回文串
- 【Manacher算法】hdu3068 最长回文
- HDU3068最长回文 Manacher算法
- hdu3068 最长回文--Manacher算法
- hdu3294 Girls' research (manacher算法,最大回文子串)
- 【最长回文子串】HDU3068最长回文【Manacher算法】
- Manacher算法--O(n)求最长回文串+hdu3068
- manacher算法求最长回文子串(hdu3068)
- hdu3068 最长回文(manacher 算法)
- hdu3068最长回文(manacher算法)
- HDU3068 最长回文(Manacher算法)
- HDU3068 最长回文(Manacher算法)
- HDU3068/Leetcode5 最长回文 (Manacher算法)
- HDU3068-最长回文(Manacher算法)
- Windows7安装U盘 DIY 制作全攻略
- 对象多态性/转型
- Activity
- 如何用Eclipse查看Hadoop源码
- c++中使用外部库exe,.dll与.lib文件的生成与使用的详解
- hdu3068&&hdu3294,回文串,Manacher算法
- MongoDB 3.0 for java (二、java操纵MongoDB)
- 总结一、VC窗口的建立
- android 传感器(OnSensorChanged)使用介绍
- SpringAOP
- 2016.3.31 蘑菇街笔试编程题2
- 中兴移动2014届校园招聘C++笔试题
- iOS --- 获取屏幕顶层的UIViewController
- ViewPager+app新手引导页