【题解】P5446 [THUPC2018]绿绿和串串(manacher)
【题解】P5446 [THUPC2018]绿绿和串串(manacher)
考虑对于一个串进行\(f\)操作,就是让他变成一个以最后一个节点为回文中心的回文串。
那么对于某个位置\(p\),假如它是一个合法的位置,那么它一直倍增一直倍增当长度大于这个原串的时候就使得\(T\)出现过一次了。
- 倍长一次就大于原串了,此时\(p\)是一个回文中心,且\(p\)的回文半径到达了\(|T|\)
- 倍长两次才大于原串,此时\(S\)倍增一次后的那个点\(p'\)是一个回文中心,且\(p'\)的回文边界到达了右边界。但为了保证第一次倍增的合法性,此时原\(p\)这个位置的回文半径要顶着\(1\)节点。
- 倍长三次...
递归地思考,一个位置合法当且仅当这个位置的回文边界顶到原串右边界,或者他的右边界的那个位置合法且自己的左边界顶到原串左边界。
用manacher实现即可,注意一个细节,就是马拉车对于每个非辅助字符的字符,他为中心的回文串的回文边界上的字符一定是个辅助字符,要减去\(1\)以达到效果。
复杂度\(O(2\sum |S|)\)
//@winlere
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; typedef long long ll;
inline int qr(){
register int ret=0,f=0;
register char c=getchar();
while(c<48||c>57)f|=c==45,c=getchar();
while(c>=48&&c<=57) ret=ret*10+c-48,c=getchar();
return f?-ret:ret;
}
const int maxn=1e6+5;
char s[maxn<<1];
bool f[maxn<<1];
int p[maxn<<1],cnt,n;
inline void manacher(){
s[0]='~',s[cnt=1]='|';
char c=getchar();
while(c<'a'||c>'z') c=getchar();
while(c>='a'&&c<='z') s[++cnt]=c,s[++cnt]='|',c=getchar();
s[cnt+1]='\0';
for(int t=1,r=0,mid=0;t<=cnt;++t){
p[t]=0;
if(r>=t) p[t]=min(r-t+1,p[(mid<<1)-t]);
while(s[t-p[t]]==s[t+p[t]]) ++p[t];
if(t+p[t]-1>r) r=t+p[t]-1,mid=t;
}
}
int main(){
n=qr();
for(int t=1;t<=n;++t){
manacher();
for(int t=cnt;t;--t) f[t]=0,f[t]=(t+p[t]-1==cnt)||(t-p[t]+1==1&&f[t+p[t]-2]);
for(int t=2;t<=cnt;t+=2) if(f[t]) printf("%d ",t>>1);
putchar('\n');
}
return 0;
}
【题解】P5446 [THUPC2018]绿绿和串串(manacher)的更多相关文章
- [题解] Luogu P5446 [THUPC2018]绿绿和串串
[题解] Luogu P5446 [THUPC2018]绿绿和串串 ·题目大意 定义一个翻转操作\(f(S_n)\),表示对于一个字符串\(S_n\), 有\(f(S)= \{S_1,S_2,..., ...
- LOJ#6387 「THUPC2018」绿绿与串串 / String (Manacher || hash+二分)
题目描述 绿绿和 Yazid 是好朋友.他们在一起做串串游戏. 我们定义翻转的操作:把一个串以最后一个字符作对称轴进行翻转复制.形式化地描述就是,如果他翻转的串为 RRR,那么他会将前 ∣R∣−1个字 ...
- 洛谷$P5446\ [THUPC2018]$绿绿和串串 $manacher$
正解:$manacher$ 解题报告: 传送门$QwQ$ 考虑这个操作的实质是啥$QwQ$?其实就,变成以最后一个节点为回文中心的回文子串嘛$QwQ$.显然就先跑个马拉车再说呗$QwQ$. 然后接着考 ...
- LOJ6387 [THUPC2018] 绿绿与串串 【manacher】
题目分析: 比较简单,先跑一边manacher,然后对于回文部分可以碰到末尾的一定满足条件,否则向后转移. 代码: #include<bits/stdc++.h> using namesp ...
- loj6387 「THUPC2018」绿绿与串串 / String
还是很好做的,大致就是manacher,每个位置为中心的最长回文串要是能抵到最右边就合法,要是能抵到最左边,那这个点的是否合法取决于以这个点为中心的最长回文串的右端点是否合法. #include &l ...
- THUPC2018看题总结
THUPC2018看题总结 #6387. 「THUPC2018」绿绿与串串 / String 据说是签到题啊. 首先根据题目的意思,我们发现如果能找到那个最后一次选择的对称轴岂不是美滋滋. 自然地,我 ...
- BZOJ 3790 神奇项链(manacher+DP+树状数组)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3790 [题目大意] 问最少用几个回文串可以构成给出串,重叠部分可以合并 [题解] 我们 ...
- 「刷题」THUPC泛做
刷了一下,写一下. T1. 天天爱射击 可以这样想. 我们二分一下每一块木板在什么时刻被击碎. 然后直接用主席树维护的话是\(O(nlog^2n)\)的. 会\(T\),而且是一分不给那种... 那么 ...
- CSS后代选择器可能的错误认识
一.关于类选择器的一个问题 CSS代码: .red { color: red; } .green { color: green; } HTML代码: <div class="red&q ...
随机推荐
- DDoS攻击新趋势:海量移动设备成为新一代肉鸡
近期,阿里云安全团队观察到数十起大规模的应用层资源耗尽式DDoS攻击(应用层CC攻击).阿里云DDoS高防实现智能防护全程自动化检测并清洗,未对用户侧业务产生任何影响,这类攻击存在一些共同的特征,阿里 ...
- mysql 忘记root密码的处理办法
参考地址: https://blog.csdn.net/vv19910825/article/details/82979563 1.修改配置文件mysql\bin\my.ini 在文本 [mysql ...
- Streamy 使用RDBMS
- MapReduce数据流-输出
- art-template web模板引擎引入JS函数
art-template语法 可以在模板引擎中加入自定义的函数; template.defaults.imports.LocalShortDate = LocalShortDate; 在模板引擎中的用 ...
- 第三期 行为规划——10.用C++实现变道函数
在之前的测验中,我们设计了一个成本函数,高速公路上到达一个目标选择一条车道. 公式中,Δd是车道间的纵向距离,Δs是车辆到目标之间的距离. 在这个测验中,需要用c++实现代价函数,但是这里有一个变换, ...
- pip 指定目录安装
pip install --target=d:\somewhere\other\than\the\default package_name
- hdu 3466 Proud Merchants(有排序的01背包)
Proud Merchants Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) ...
- [转]分布式监控工具Ganglia 介绍 与 集群部署.
如果你目的很明确就是冲着标题来的,不爱看我唠叨,请直接进入第二个分割线之后的内容. 其实之前就是有做Swift监控平台的打算的,但是因为没什么硬性需求么,也不要紧的,就一直搁置了.最近实验室来了个大二 ...
- 154th LeetCode Weekly Contest
A B D均比较简单.先说C题 K-Concatenation Maximum Sum Given an integer array arr and an integer k, modify the ...