博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 5340 (manacher)
阅读量:5956 次
发布时间:2019-06-19

本文共 1383 字,大约阅读时间需要 4 分钟。

 

Sample Input
2 abc abaadada
 

 

Sample Output
Yes No

 

 

判断是否能成为3个非空回文子串

manacher算法求出个点回文长度,在找出第一个和最后一个保存下来,再判断中间的

 

#include
#include
#include
#include
#include
using namespace std;typedef long long ll;typedef unsigned long long ull;#define MOD 3221225473#define MAXN 20005#define MIN 0#define MAX 1000001int n;char d[MAXN];char st[MAXN*2];int p[MAXN*2],begi[MAXN*2],tail[MAXN*2];int len;void manacher(){ int MaxId=0,id; for(int i=0; i
i) p[i]=min(p[2*id-i],MaxId-i); else p[i]=1; while(st[i+p[i]]==st[i-p[i]]) p[i]++; if(p[i]+i>MaxId) { id=i; MaxId=p[i]+i; } p[i] -= 1; }}int main(){ int T; scanf("%d",&T); while(T--) { getchar(); scanf("%s",d); int l = strlen(d); len = 0; st[len++] = '#'; for(int i = 0; i < l; i++) { st[len++] = d[i]; st[len++] = '#'; } st[len] = 0; manacher(); int flag = 0; int pn =0 ,ln = 0; for(int i = 1; i < len - 1; i++) { if(i - p[i] == 0) begi[pn++] = i; if(i + p[i] == len-1) tail[ln++] = i; } for(int i = 0; i < pn; i++) { for(int j = ln - 1; j>=0; j--) { int s1 = begi[i] + p[begi[i]]+1 ,s2 = tail[j] - p[tail[j]]-1; if(s1 > s2) break; int mid = (s1 + s2)/2; if(p[mid] >= mid-s1) { flag = 1; break; } } if(flag ) break; } if(flag ) printf("Yes\n"); else printf("No\n"); } return 0;}

  

转载于:https://www.cnblogs.com/Przz/p/5409774.html

你可能感兴趣的文章
什么是9.png,如何制作,如何使用。
查看>>
7.3(java学习笔记)网络编程之UDP
查看>>
thymeleaf教程
查看>>
HNOI 2002 营业额统计
查看>>
WordPress 5.0禁用古滕堡编辑器的方法
查看>>
最新的导出文档方法
查看>>
简单搭配(Collocation)隐私声明
查看>>
2013编程之美资格赛【传话游戏】
查看>>
关于Dictionary的线程安全问题
查看>>
在python中单线程,多线程,多进程对CPU的利用率实测以及GIL原理分析
查看>>
数据类型与变量
查看>>
CentOS6.5+mysql5.1源码安装过程
查看>>
Js 笔记
查看>>
C++: find()函数的注意事项
查看>>
android studio中添加新的model时候
查看>>
js的事件学习笔记
查看>>
leetcode 【 Add Two Numbers 】 python 实现
查看>>
Android接收系统广播
查看>>
将网络中的图片存为NSData并保存到sqlite的BLOB字段中
查看>>
Cocos2d-js-v3.2 在 mac 上配置环境以及编译到 Andorid 的注意事项(转)
查看>>