[题解] Luogu P5446 [THUPC2018]绿绿和串串
[题解] Luogu P5446 [THUPC2018]绿绿和串串
·题目大意
- 定义一个翻转操作\(f(S_n)\),表示对于一个字符串\(S_n\),
有\(f(S)= \{S_1,S_2,...,S_{n-1},S_n,S_{n-1},...S_2,S_1 \}\)。 - 现在给定一个长度为\(n\)的字符串\(S^{'}\)表示原字符串\(S\)经过若干次(可能为0)旋转之后的一个前缀,
求原来字符串可能的长度\(l\)。 - 显然当\(l > n\)时一定可行,所以只需要输出所有的\(l\leq n\)即可。
\(|S|\leq 10^6,\Sigma |S| \leq 5 \times 10^6\)
·解题思路
首先想到用 \(Manacher\) 。
由于进行翻转操作后回文串长度必定为奇数,所以不用插入字符,然后考虑什么情况下长度是可行的。
- 我们定义一个 \(flag\) 数组,\(flag[i]\) 表示长度为 \(i\) 时是可行的。回文数组为\(p\),\(p[i]\)表示第 \(i\) 位的回文半径位 \(p[i]\)
- 如果只进行了一次翻转操作即可使得前缀为\(S^{'}\),那么有 \(i + p[i] - 1 == n\)
- 如果需要进行\(k\)次翻转才可以使得前缀为\(S^{'}\),那么有 \(i - p[i] + 1 == 1\),然后可以转化为进行\(k - 1\)次的情况。
但是实际操作中我们不用跑 \(k\) 次,只需要倒着跑并记录 \(flag\) ,因为当我们处理长度为 \(i\) 的时候,\(flag[i + 1]\) 到 \(flag[n]\) 都已经处理过了,所以判断 \(flag[i + p[i] - 1] == 1\)即可。 - 时间复杂度为\(O(n)\)。
代码实现
#include <iostream>
#include <cstring>
using namespace std;
#define reg register
namespace io {
char ch[20];
template<typename T>inline void write(T x) {
(x < 0) && (x =- x, putchar('-'));
(x) || putchar('0');
reg int i = 0;
while (x) ch[i++] = x % 10 ^48, x /= 10;
while (i) putchar(ch[--i]);
}
}//快写
#define wt io::write
const int maxN = 1000010;
char s[maxN];
int p[maxN], flag[maxN];
int n;
void work();
int main() {
int t;
scanf("%d", &t);
while (t--) work();
return 0;
}
void work() {
for (reg int i = 1; i <= n; ++i) flag[i] = p[i] = s[i] = 0;
n = 1; s[0] = '@';
scanf("%s", s + 1);
while (s[n]) ++n;
--n;
for (reg int i = 1, r = 0, mid = 0; i <= n; ++i) {
if (i <= r) p[i] = min(p[mid * 2 - i], r - i + 1);
while (s[i + p[i]] == s[i - p[i]]) ++p[i];
if (i + p[i] - 1 >= r) r = i + p[i] - 1, mid = i;
}//Manacher
for (reg int i = n; i; --i) {
if (i + p[i] - 1 == n || (flag[i + p[i] - 1] && i - p[i] + 1 == 1)) flag[i] = 1;
}//上面说的两种情况
for (reg int i = 1; i <= n; ++i)
if (flag[i]) wt(i), putchar(' ');
putchar('\n');
}
[题解] Luogu P5446 [THUPC2018]绿绿和串串的更多相关文章
- 【题解】P5446 [THUPC2018]绿绿和串串(manacher)
[题解]P5446 [THUPC2018]绿绿和串串(manacher) 考虑对于一个串进行\(f\)操作,就是让他变成一个以最后一个节点为回文中心的回文串. 那么对于某个位置\(p\),假如它是一个 ...
- 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 ...
- 题解 Luogu P2499: [SDOI2012]象棋
关于这道题, 我们可以发现移动顺序不会改变答案, 具体来说, 我们有以下引理成立: 对于一个移动过程中的任意一个移动, 若其到达的位置上有一个棋子, 则该方案要么不能将所有棋子移动到最终位置, 要么可 ...
- 题解 luogu P1144 【最短路计数】
本蒟蒻也来发一次题解第一篇请见谅 这个题有几个要点 1.无向无权图,建图的时候别忘记建来回的有向边[因此WA掉1次 2.无权嘛,那么边长建成1就好了2333333 3.最短路采用迪杰斯特拉(别忘用堆优 ...
- 题解 Luogu P1110 【[ZJOI2007]报表统计】
感谢 @cmy962085349 提供的hack数据,已经改对了. 先声明,我好像是题解里写双$fhq$ $treap$里唯一能过的...(最后两个点啊) 思路:首先看题目,$MIN_GAP_SORT ...
- 题解 Luogu P3370
讲讲这题的几种做法: 暴力匹配法 rt,暴力匹配,即把字符串存起来一位一位判相等 时间复杂度$ O(n^2·m) $ 再看看数据范围 \(n\le10^5,m\le10^3\) 当场爆炸.当然有暴力分 ...
随机推荐
- Appium - monkey自定义脚本实践(四)
monkey自定义脚本实践 一.获取元素坐标点位置 二.Monkey脚本API简介 常规Monkey测试执行的是随机的事件流,但如果只是想让Monkey测试某个特定场景这时候就需要用到自定义脚本了,M ...
- 微信小程序云开发-数据库-商品列表数据跳过N条数据
一.WXML实现 在wxml文件中添加对应链接,点击链接绑定事件skipGoods. 二.js实现 js文件中写skipGoods()函数,实现跳过2条数据的功能.
- 八大排序算法~冒泡排序【加变量flag的作用】
八大算法~冒泡排序[加变量flag的作用] 1,冒泡排序思想:从第一个数开始找,要把大数"排除在外"~为大数找后座.(从小到大排序哈) 外层循环~需要放后的大数个数: 内循环~从第 ...
- linux系统安装+windows系统安装
linux 1.格式化U盘 打开管理员命令提示符 diskpart list disk select disk 2 clean create partition primary format fs=f ...
- JS文件延迟和异步加载:defer和async属性
-般情况下,在文档的 <head> 标签中包含 JavaScript 脚本,或者导入的 JavaScript 文件.这意味着必须等到全部 JavaScript 代码都被加载.解析和执行完以 ...
- C#.NET RSA 私钥签名 公钥验证签名
C#.NET RSA 私钥签名 公钥验证签名 公钥验签 1.待签名字符串转为byte数组时,一般使用UTF8. 2.将私钥字符串(PKCS8或PKCS1格式)转为C#.NET的RSACryptoSer ...
- EF中数据修改时动态更新其他数据
场景 利用.net core开发时,经常会遇到使用EF(Entity Framework),但是今天在开发过程中发现一个值莫名其妙的自己变了,我怀疑是EF的问题. 主要代码如下: 1 // 最近一条告 ...
- Rancher监控指标一文干到底
一.工作负载指标 直接截取一个生产环境的rancher的web管理端-工作负载指标模块的图(这里没有汉化,直接英文)如下: 共5个大指标: CPU使用 内存使用 网络包 网络IO 磁盘IO 自学入口: ...
- 痞子衡嵌入式:嵌入式Cortex-M中断向量表原理及其重定向方法
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是Cortex-M中断向量表原理及其重定向方法. 接着前文 <嵌入式Cortex-M裸机环境下临界区保护的三种实现> 继续聊, ...
- Activiti7 结束/终止流程
1. 结束/终止 正在运行的流程实例 思路:跟回退一样的思路一样,直接从当前节点跳到结束节点(EndEvent) /** * 结束任务 * @param taskId 当前任务ID */ publi ...