HDU 3294 manacher
来源:互联网 发布:spring resource和java 编辑:程序博客网 时间:2024/05/22 15:14
给定一个字符和一个字符串,求转化后字符串出现的第一个最长回文(即有很多相同长度,输出第一个),并输出起始终点位置,以及转化后的回文串。
manacher算法求得最长回文串的长度mxx以及该回文串的中心位置iid,原位置为(iid-mxx+1)/2-1~(iid+mxx-1)/2-1.
#include <bits/stdc++.h>using namespace std;const int maxn =200000+50;char s[maxn];char Ma[maxn*2];int Mp[maxn*2];int mxx,iid; void manacher(char s[],int len) { mxx=-1; int l=0; Ma[l++]='$'; Ma[l++]='#'; for(int i=0;i<len;i++) { Ma[l++]=s[i]; Ma[l++]='#'; } Ma[l]=0; int mx=0,id=0; for(int i=0;i<l;i++) { Mp[i]=mx>i?min(Mp[2*id-i],mx-i):1; while(Ma[i+Mp[i]]==Ma[i-Mp[i]])Mp[i]++; { if(i+Mp[i]>mx) { mx=i+Mp[i]; id=i; } if(Mp[i]-1>mxx) { mxx=Mp[i]-1; iid=i; } } } }int main(){ char c; while(~scanf(" %c%s",&c,s)) { int k = c-'a'; int len=strlen(s); for(int i=0;i<len;i++) { s[i]-=k; if(s[i]<'a') s[i]+=('z'-'a'+1); } manacher(s,len); if(mxx==1) printf("No solution!\n"); else { printf("%d %d\n",(iid-mxx+1)/2-1,(iid+mxx-1)/2-1); for(int i=(iid-mxx+1)/2-1;i<=(iid+mxx-1)/2-1;i++) printf("%c",s[i]); printf("\n"); } }}
阅读全文
0 0
- hdu 3294 manacher算法
- HDU 3294 manacher
- [manacher] hdu 3294 Girls' research
- hdu 3294 Girls' research(manacher)
- HDU - 3294 Girls' research(manacher)
- HDU 3294 Manacher模版题
- hdu 3294 Girls' research【manacher】
- hdu 3294 Manacher模版题
- HDU 3294 Girls’ research Manacher
- HDU 3294 Girls' research 字符串-manacher算法
- HDU 3294 解题报告 Manacher 算法
- HDU 3294 Girls' research (manacher)
- hdu 3294 Girls' research Manacher回文串
- HDU.3294 Girls' research Manacher Algorithm
- hdu 3068 Manacher
- hdu 3068 4513 manacher
- hdu 3068 manacher算法
- hdu 5340 manacher
- openjudge noi 9278 旅行
- 第五周实践项目一__建立顺序栈算法库
- ACM工作室的日常记录-第二次内部测试
- Jzoj4709 Matrix
- JAVA笔记面向对象1
- HDU 3294 manacher
- mysql的三大组成语言
- 周中训练笔记10
- 使用Flask渲染静态网页(模板)
- 对数几率回归
- 破解极域电子教室(基础方法)
- loadrunner Lr_类函数之lr_enable_ip_spoofing()和lr_disable_ip_spoofing()
- [复习]哈希表 集合A
- 【线段树维护单调栈】【JZOJ 5402】 God Knows