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 的奇幻冒险是一部非常火的漫画.漫画中的男主角经常喜欢连续喊很多的「欧拉」或者「木大」. 为了防止字太多挡住漫画内容,现在打算在新的漫画中用 ...
随机推荐
- pyqt5.0 GraphicsView框架
场景(The Scene) QGraphicsScene提供图形视图场景.该场景具有以下职责: 提供用于管理大量图元的快速界面(锅) 将事件传播到每个图元(把螃蟹烧熟了) 管理图元状态,例如选择和焦点 ...
- windows下wmic命令
转载 https://www.cnblogs.com/archoncap/p/5400769.html 第一次执行WMIC命令时,Windows首先要安装WMIC,然后显示出WMIC的命令行提示符.在 ...
- CentOS 7 无法yum安装解决方法
1)下载repo文件 wget http://mirrors.aliyun.com/repo/Centos-7.repo 2)备份并替换系统的repo文件 .repo /etc/yum.repos.d ...
- 性感天才黑客乔治·霍兹George Hotz 17岁打脸乔布斯20岁搞疯索尼
1.国内外著名黑客信息 1) 国外著名黑客 George Hotz 乔治·霍兹(George Hotz,1989年10月2日-),美国学生,2007年8月解锁苹果(Apple)iPhone手机,使得i ...
- DJango 基础 (5)
模板加载静态文件 在settings.py文件中添加STATICFILES_DIRS,设置静态文件目录路径,同templates. # settings.py文件中STATIC_URL = '/st ...
- C程序的编译与链接
编译器驱动程序 编译器驱动程序可以在用户需要时调用语言预处理器.编译器.汇编器和链接器. 例如使用GNU编译系统,我们需要使用如下命令来调用GCC驱动程序: gcc -o main main.c 编译 ...
- lambda正则化参数的大小影响
当lambda的值很小时,其惩罚项值不大,还是会出现过拟合现象,当时lambda的值逐渐调大的时候,过拟合现象的程度越来越低,但是当labmda的值超过一个阈值时,就会出现欠拟合现象,因为其惩罚项太大 ...
- C#之SByte
int8 C#中,byte为无符号8位整数,而Sbyte为有符号8位整数,对应java中的byte类型. 方法一将 byte 转为 sbyte.原理很简单,就是当 byte 小于 128 时其值保持不 ...
- [leetcode]40. Combination Sum II组合之和之二
Given a collection of candidate numbers (candidates) and a target number (target), find all unique c ...
- node.js中stream流中可读流和可写流的使用
node.js中的流 stream 是处理流式数据的抽象接口.node.js 提供了很多流对象,像http中的request和response,和 process.stdout 都是流的实例. 流可以 ...