LOJ#6387 「THUPC2018」绿绿与串串 / String (Manacher || hash+二分)
题目描述
绿绿和 Yazid 是好朋友。他们在一起做串串游戏。
我们定义翻转的操作:把一个串以最后一个字符作对称轴进行翻转复制。形式化地描述就是,如果他翻转的串为 RRR,那么他会将前 ∣R∣−1个字符倒序排列后,插入到串的最后。
举例而言,串abcd
进行翻转操作后,将得到abcdcba
;串qw
连续进行 2次翻转操作后,将得到qwqwq
;串z
无论进行多少次翻转操作,都不会被改变。
贪玩的绿绿进行了若干次(可能为 0 次)翻转操作。
淘气的绿绿又展示出了一个非空串 S,并表示 S 是最终的串 R 的前缀。现在,他想考考 Yazid,初始的串 R 的长度可能是多少。
Yazid 找到了正在参加清华校赛的你,请你来帮他解决这个问题。但聪明的 Yazid 发现,所有超过 ∣S∣ 的整数都一定是 R 的可能长度,因此你只需要告诉他不超过的 ∣S∣ 的 R 的可能长度即可。
为了帮助你理解问题,Yazid 还将对一些概念和记号做出解释:
对于一个串 S,∣S∣ 表示的是该串的长度。
对于一个串 S,我们定义串 T 是它的前缀,当且仅当 ∣T∣≤∣S∣,且对于任意整数 iii 满足 1≤i≤∣T∣,都有 TTT 的左起第 i 个字符与 S 的左起第 i 个字符相同。(形象地理解,即 T 在 S的前部出现)
如:
abc
是abcdefg
的前缀,aba
不为abba
的前缀,z
为z
的前缀,空串为任意一个串的前缀。
输入格式
输入包含多组数据,第一行一个整数 T 表示数据组数。接下来依次描述每组数据,对于每组数据:
- 一行一个仅由小写字母组成的非空字符串 S。
输出格式
对于每组数据,输出 1 行:
- 从小到大输出 ∣R∣ 的所有不超过 ∣S∣的可能值,所有值之间用单个空格隔开。
样例
样例输入
4
abcdcb
qwqwq
qaqaqqq
carnation
样例输出
4 6
2 3 4 5
6 7
9
数据范围与提示
保证 ∣S∣≤1e66,∑∣S∣≤5×106\sum\left| S\right|\leq 5\times 10^6∑∣S∣≤5×106。
∑∣S∣ 表示的是单个测试点中所有数据 ∣S∣ 的总和。
天坑已补,在Manacher内一个for循环判断以该点为中心的最长回文子串能不能抵达原串的最右端即可
emmm,具体看代码
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <map>
#define ll long long
using namespace std;
const int maxn=1e6+; char str[*maxn],s[maxn];
int len1,len2,vis[maxn*],p[maxn*];
vector<int>vc; void init()
{
str[]='$';
str[]='#';
for(int i=; i<len1; i++)
{
str[i*+]=s[i];
str[i*+]='#';
}
len2=len1*+;
str[len2]='*';
} void Manacher()
{
int id=,mx=;
for(int i=; i<len2; i++)
{
if(mx>i) p[i] =min(p[*id-i],mx-i);
else p[i]=;
for(; str[i-p[i]]==str[i+p[i]]; p[i]++);
if(p[i]+i>mx)
{
mx=p[i]+i;
id=i;
}
}
// for(int i=0;i<len2;i++) printf("%c",str[i]);cout<<endl;
// for(int i=0;i<len2;i++)printf("%d",p[i]);cout<<endl;
memset(vis,,sizeof(vis));
vc.clear();
for(int i=len1-; i>=; i--)
{
int r=p[(i+)*]/; //以当前位置为中心的最长回文子串长度
if(i+r==len1) vis[i]=; //能抵达最右边 合法
if(i+-r==) vis[i]=vis[i+r-]; //较短,能抵达最左边,若合法,则说明能继续以最右端为中心翻转,此时最右边端点合法
if(vis[i]) vc.push_back(i+);
}
for(int i=vc.size()-; i>=; i--)
printf("%d%c",vc[i],i==?'\n':' ');
}
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>s;
len1=strlen(s);
init();
Manacher();
}
return ;
}
Hash + 二分
#include<bits/stdc++.h>
using namespace std;
const int N=;
int t,n,l[N];
char str[N]={'$'};
int main(){
scanf("%d",&t);
while(t--){
scanf("%s",str+);
n=strlen(str+);
for(int i=;i<=n;i++)l[i]=;
int id=,mx=;
for(int i=;i<=n;i++){
l[i]=max(,min(mx-i+,l[(id<<)-i]));
while(str[i-l[i]]==str[i+l[i]])l[i]++;
if(mx<i+l[i]-)mx=i+l[i]-,id=i;
}
//for(int i=1;i<=n;i++)printf("%d ",l[i]);printf("\n");
for(int i=;i<n;i++){
int mid=i;
while(mid<=n){
if(l[mid]<mid&&mid+l[mid]<=n)break;
mid=(mid<<)-;
}
if(n<mid)printf("%d ",i);
}
printf("%d\n",n);
}
return ;
}
LOJ#6387 「THUPC2018」绿绿与串串 / String (Manacher || hash+二分)的更多相关文章
- Loj #2554. 「CTSC2018」青蕈领主
Loj #2554. 「CTSC2018」青蕈领主 题目描述 "也许,我的生命也已经如同风中残烛了吧."小绿如是说. 小绿同学因为微积分这门课,对"连续"这一概 ...
- Loj #2192. 「SHOI2014」概率充电器
Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...
- Loj #3096. 「SNOI2019」数论
Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...
- Loj #3093. 「BJOI2019」光线
Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...
- Loj #3089. 「BJOI2019」奥术神杖
Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...
- Loj #2542. 「PKUWC2018」随机游走
Loj #2542. 「PKUWC2018」随机游走 题目描述 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次 ...
- Loj #3059. 「HNOI2019」序列
Loj #3059. 「HNOI2019」序列 给定一个长度为 \(n\) 的序列 \(A_1, \ldots , A_n\),以及 \(m\) 个操作,每个操作将一个 \(A_i\) 修改为 \(k ...
- Loj #3056. 「HNOI2019」多边形
Loj #3056. 「HNOI2019」多边形 小 R 与小 W 在玩游戏. 他们有一个边数为 \(n\) 的凸多边形,其顶点沿逆时针方向标号依次为 \(1,2,3, \ldots , n\).最开 ...
- Loj #3055. 「HNOI2019」JOJO
Loj #3055. 「HNOI2019」JOJO JOJO 的奇幻冒险是一部非常火的漫画.漫画中的男主角经常喜欢连续喊很多的「欧拉」或者「木大」. 为了防止字太多挡住漫画内容,现在打算在新的漫画中用 ...
随机推荐
- 【FZSZ2017暑假提高组Day1】确定小组
[问题描述] 有n个人坐成一排,这n个人都在某一个小组中,同一个小组的所有人所坐的位置一定是连续的. 有一个记者在现场进行采访,他每次采访都会询问一个人其所在的小组有多少人,被询问的每个人都给出了正确 ...
- 1.MySQL基础
1.创建一个数据库: create database db_test; 2.创建一个表: MySQL [mysql]> use db_test; Database changed MySQL [ ...
- 26.Hibernate-主键和映射.md
目录 1.复合主键映射 [toc] 2.集合映射 2.1Set集合 2.2其他集合 [toc] 3.集合数据的读取 [toc] 4.一对多和多对一映射 4.1概念 4.2配置和开发 4.2.1关键点 ...
- Ubuntu下解决MySQL自启动,chkconfig list 全部off 情况
chkconfig命令是用于RedHat/Fedora发行版的,而对于像Ubuntu之类的Debian发行版,应该使用这个命令: sudo update-rc.d mysql defaults 验证一 ...
- C++ 迭代器的使用和操作
迭代器是一种检查容器内元素并遍历元素的数据类型.C++更趋向于使用迭代器而不是下标操作,因为标准库为每一种标准容器(如vector)定义了一种迭代器类型,而只用少数容器(如vector)支持下标操作访 ...
- jQuery截取字符串的几种方法
1.取后缀 var fileDir = $("#file").val(); var suffix = fileDir.substr(fileDir.lastIndexOf(&quo ...
- C++对象的内存分布和虚函数表
c++中一个类中无非有四种成员:静态数据成员和非静态数据成员,静态函数和非静态函数. 1.非静态数据成员被放在每一个对象体内作为对象专有的数据成员. 2.静态数据成员被提取出来放在程序的静态数据 ...
- 735. Asteroid Collision彗星相撞后的消失数组
[抄题]: We are given an array asteroids of integers representing asteroids in a row. For each asteroid ...
- 加NONCLUSTERED INDEX索引,在ON了之后还要INCLUDE
之前加了索引,但效果不大 SET STATISTICS TIME ON --执行时间 SET STATISTICS IO ON --IO读取 DBCC DROPCLEANBUFFERS --清除缓冲区 ...
- go语言 http学习
net/http库学习 概念 处理器 处理器:拥有ServeHTTP方法的接口(任何类型) 签名:ServeHTTP(http.ResponseWriter, *http.Request) Respo ...