博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ3790:神奇项链(Manacher)
阅读量:7187 次
发布时间:2019-06-29

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

Description

母亲节就要到了,小 H 准备送给她一个特殊的项链。这个项链可以看作一个用小写字
母组成的字符串,每个小写字母表示一种颜色。为了制作这个项链,小 H 购买了两个机器。第一个机器可以生成所有形式的回文串,第二个机器可以把两个回文串连接起来,而且第二个机器还有一个特殊的性质:假如一个字符串的后缀和一个字符串的前缀是完全相同的,那么可以将这个重复部分重叠。例如:aba和aca连接起来,可以生成串abaaca或 abaca。现在给出目标项链的样式,询问你需要使用第二个机器多少次才能生成这个特殊的项链。 

Input

输入数据有多行,每行一个字符串,表示目标项链的样式。 

Output

多行,每行一个答案表示最少需要使用第二个机器的次数。 

Sample Input

abcdcba
abacada
abcdef

Sample Output

0
2
5

HINT

每个测试数据,输入不超过 5行
每行的字符串长度小于等于 50000

Solution

先manacher求出len数组
然后问题就可以转化成线段区间完全覆盖问题
贪心就可以了

Code

1 #include
2 #include
3 #include
4 #include
5 #define N (100000+1000) 6 using namespace std; 7 8 struct Node{
int x,y;}L[N]; 9 bool cmp(Node a,Node b){
return a.x
maxn) x=1;19 else x=min(maxn-i+1,len[mid*2-i]);20 while (s[i+x]==s[i-x]) ++x;21 len[i]=x;22 if (i+x-1>maxn) maxn=i+x-1,mid=i;23 }24 }25 26 int main()27 {28 while (scanf("%s",a)!=EOF)29 {30 n=strlen(a);31 tot=0;32 s[++tot]='@'; s[++tot]='#';33 for (int i=0; i

转载于:https://www.cnblogs.com/refun/p/9445745.html

你可能感兴趣的文章
mysql 开发进阶篇系列 45 物理备份与恢复(xtrabackup 安装,用户权限,配置)
查看>>
实验三+108+曾宏宇
查看>>
[USACO5.4]奶牛的电信Telecowmunication 最小割
查看>>
状态模式
查看>>
解决iphone横屏时字体变大问题或者内容大小不一样等...
查看>>
js-基本语法2
查看>>
Scrum_2 5 20
查看>>
linux用户添加到多个组
查看>>
成功产品的规律及团队角色职责,互联网营销
查看>>
艾伟_转载:Socket开发探秘--基类及公共类的定义
查看>>
2018-2019-1 20165303 20165316 20165335 实验一 开发环境的熟悉
查看>>
homework-07
查看>>
如何给tomcat 7.0.32添加用户
查看>>
webpack 简单配置
查看>>
Sql Helper封装
查看>>
地址栏参数特殊字符
查看>>
sweetalert插件使用
查看>>
Unity 2D人物运动不协调的检查方法(本人专用)
查看>>
oracle 存储过程详细介绍(创建,删除存储过程,参数传递等)
查看>>
textview第一次出现不可滚动文本,但是点击出现键盘,键盘落下,就可以滚动问题...
查看>>