虽然训练指南上没有讲 Manacher……但是这题几乎就是一个裸的 Manacher啊……

然而书上的标签是:有难度,配合数据结构

Manacher详解

题意

问给定字符串中最大的W串的长度。其中W串的定义:形式为 ww'w' 的字符串,w' 为 w 的反串

思路

根据题目描述,显然 ww'ww' 和 ww' 都是回文串。

考虑 Manacher 的原理,不重不漏地枚举了每个回文串,也就是说考虑到了每一个回文串。

先回归暴力,想到可以枚举每个回文串并判断右边是否也是相同的一个回文串。

“枚举每个回文串”,和 Manacher 有相似之处。也就是说,我们是否可以在 Manacher 的运行过程中就完成答案统计?

设现在处理到了第 i 个位置,根据 Manacher 把奇数串转化成偶数串的思想,要求 i 是分隔符 #.

当 i 位置的回文半径达到 4 的倍数的时候,说明左半边的串长度是偶数,设当前回文半径为 r,显然左半边串的中心位置 \(pos=i-r/2
\),如果 pos 处的回文半径不小于 \(i-r/2\) ,那么左半边就是回文串,\(ans=max( ans,r )\).

代码

#include <bits/stdc++.h>
using namespace std;
const int N=3e5+10;
int n,r[N<<1];
char str[N],s[N<<1]; void manacher()
{
int mx=0,pos=0,len=2*n+1,ans=0;
for ( int i=0; i<len; i++ )
{
if ( i<mx ) r[i]=min( r[2*pos-i],mx-i );
else r[i]=1;
while ( i+r[i]<len && i-r[i]>=0 && s[i+r[i]]==s[i-r[i]] )
{
if ( s[i]=='#' && r[i]%4==0 && r[i-r[i]/2]>=r[i]/2 ) ans=max( ans,r[i] );
r[i]++;
}
if ( i+r[i]>mx ) mx=i+r[i],pos=i;
}
printf( "%d\n",ans );
} void prework()
{
int pos=0; n=strlen(str);
for ( int i=0; i<n; i++ )
s[pos++]='#',s[pos++]=str[i];
s[pos++]='#';
} int main()
{
int T; scanf( "%d",&T );
while ( T-- )
{
scanf( "%s",str ); prework();
manacher();
}
}

【题解】Casting Spells(UVA1470)的更多相关文章

  1. 【题解】Casting Spells LA 4975 UVa 1470 双倍回文 SDOI 2011 BZOJ 2342 Manacher

    首先要吐槽LRJ,书上给的算法标签是“有难度,需要结合其他数据结构”,学完Manacher才发现几乎一裸题 题目的意思是问原串中有多少个wwRwwR这样的子串,其中wR表示w的反串 比较容易看出来,w ...

  2. 题解 [AGC017C] Snuke and Spells

    题目传送门 Description 有 \(n\) 个球排在一起,每个球有颜色 \(a_i\),若当前有 \(k\) 个球,则会将所有 \(a_i=k\) 的球删掉.有 \(m\) 次查询,每次将 \ ...

  3. AtCoder Grand Contest 017 题解

    A - Biscuits 题目: 给出 \(n\) 个物品,每个物品有一个权值. 问有多少种选取方式使得物品权值之和 \(\bmod\space 2\) 为 \(p\). \(n \leq 50\) ...

  4. Codeforces Round #635 (Div. 2) 题解

    渭城朝雨浥轻尘,客舍青青柳色新. 劝君更尽一杯酒,西出阳关无故人.--王维 A. Ichihime and Triangle 网址:https://codeforces.com/contest/133 ...

  5. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  6. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  7. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  8. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  9. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

随机推荐

  1. c++ 11字符串与string转换常用函数

    这里主要介绍一下string to int 其他方法与这个类似,可到头文件 <string> 中查看 @_Str 转换的字符串 @_Idx 转换的长度(位数) @_Base 进制 doub ...

  2. Java中List,Set,Map区别

    在Java开发面试中,面试官最常问到的就是Java集合,免不了要让面试者说出之间的区别,下面博主就对其做了总结. 1.集合与数组的区别 长度区别:数组是固定长度,集合长度可变: 内容区别:数组可以是基 ...

  3. 控制算法PID-理解分析1

    以下内容是来自网络上的,本人觉得有道理,拷贝下来,由于没有找到最源头的出处,没有注明来自何方. 转载,下面说法应该更通俗易懂一家庭,每次需要开支的时候丈夫P都要拿卡去取钱.需要多少取多少,因为银行最低 ...

  4. spring boot和spring cloud的区别

    Java中说到微服务肯定离不开Spring Boot和Spring Cloud,这两者到底有什么关系,什么是微服务,如果单纯的说SpringBoot,SpringCloud,都是不准确的,那应该怎么回 ...

  5. Dnscat2实现DNS隐蔽隧道反弹Shell

    DNS介绍 DNS是域名系统(Domain Name System)的缩写,是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被 ...

  6. 本地VM安装虚拟机,使用xshell连接

    首先把VM设置成上面那样 在ubuntu里面安装ssh apt-get install openssh-server 启动服务 /etc/init.d/ssh startifconfig 查看ip x ...

  7. 循序渐进VUE+Element 前端应用开发(29)--- 高级查询条件的界面设计

    在系统模块中的业务列表展示里面,一般我们都会在列表中放置一些查询条件,如果是表字段不多,大多数情况下,放置的条件有十个八个就可以了,如果是字段很多,而这些条件信息也很关键的时候,就可能放置很多条件,但 ...

  8. Java基础教程——方法引用

    方法引用 Lambda表达式的代码,是否可以再简洁?--方法引用 对象/类名::方法名 参数都不用写明. import java.util.function.Consumer; public clas ...

  9. CentOS下关于集群同步/LB/HA 的尝试

    Zookepper 集群同步 下载解压 wget http://apache.fayea.com/zookeeper/stable/zookeeper-3.4.8.tar.gz tar xvf zoo ...

  10. CentOS下搭建简易iSCSI服务

    iscsi 服务器端设置 安装target包 yum install scsi-target-utils.x86_64 创建测试裸磁盘 dd if=/dev/zero of=/iSCSIdisk/20 ...