HDU
来源:互联网 发布:linux if语句的用法 编辑:程序博客网 时间:2024/06/05 10:32
点我看题
题意:给一个字符和一个串,根据一定的规则变换串,然后找出最长回文子串并输出串最右两端的下标。
分析:manacher模板题,在求解下标的时候利用到manacher最基本的性质—变换后的字符串的回文子串都是奇数,然后可以很顺利的找出manacher的下标。
参考代码:
#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#include<iostream>using namespace std;#define INF 0x3f3f3f3fconst int maxn = 2e5+100;int n;char ch;char s[maxn<<1];int p[maxn<<1];void manacher(){ memset(p,0,sizeof(p)); for( int i = n; i >= 0; i--) { s[i*2+2] = s[i]; s[i*2+1] = '#'; } s[0] = '$'; int id, mx = 0; for( int i = 1; i < 2*n+1; i++) { if( i < mx) p[i] = min(p[2*id-i],mx-i); else p[i] = 0; while( s[i-p[i]] == s[i+p[i]]) p[i]++; if( i+p[i] > mx) { mx = i+p[i]; id = i; } }}int main(){ while( ~scanf("%c%s",&ch,s)) { n = strlen(s); int d = ch-'a'; for( int i = 0; i < n; i++) s[i] = (s[i]-'a'-d+26)%26+'a'; manacher(); int id = -1, mx = -INF; for( int i = 1; i < 2*n+1; i++) if( p[i] > mx) mx = p[i], id = i; mx--; int tmp = mx/2;//前面或后面有多少个字母在回文中 if( tmp) { int l = id-mx+1; int r = id+mx-1; printf("%d %d\n",(l-2)/2,(r-2)/2); for( int i = l; i <= r; i++) if( s[i] != '#') printf("%c",s[i]); puts(""); } else puts("No solution!"); getchar(); } return 0;}
阅读全文
0 0
- hdu
- hdu
- HDU
- hdu ()
- hdu
- hdu
- HDU
- HDU
- hdu
- hdu
- HDU
- Hdu
- hdu
- hdu-
- hdu
- hdu
- hdu
- HDU
- 013大数据课程知识点小结
- JavaScript CSS-DOM技术
- 信息检索评价指标NDCG、a-NDCG
- 深记“volatile”的重要性
- C语言学习历程(十)“函数指针”与“指针型函数”
- HDU
- Ubuntu查看系统的各种版本信息
- 利用Python制作简单的中英翻译器
- 二叉树部分相关练习题
- 视频监控安防平台-GB28181-exosip协议栈系统刷新订阅
- 4 technology trends to watch in 2016
- 项目管理--maven浅析《三》之分模块管理SSH项目
- 一个Pythonic的i问财量化策略工具包——wencai
- 类的初始化的时机