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 的奇幻冒险是一部非常火的漫画.漫画中的男主角经常喜欢连续喊很多的「欧拉」或者「木大」. 为了防止字太多挡住漫画内容,现在打算在新的漫画中用 ...
随机推荐
- ios黑科技
1.brew brew 是 Mac 下的一个包管理工具,类似于 centos 下的 yum,可以很方便地进行安装/卸载/更新各种软件包,例如:nodejs, mysql等,可以用来快速搭建各种本地环境 ...
- Jquery中父,子页面之间元素获取及方法调用
一.jquery 父.子页面之间页面元素的获取,方法的调用: 1. 父页面获取子页面元素: 格式:$("#iframe的ID").contents().find("#if ...
- java学习笔记(三):类和对象
创建对象 构造器 每一个类都有一个构造器. 如果我们不单独为一个类编写构造器那么 Java 的编译器将会给这个类建立一个默认的构造器. 每当一个新的对象被创建,至少一个构造器将会被调用. 构造器的一 ...
- [Java学习]多线程
关于多进程与多线程 使用多进程的目的:提高CPU利用率. 使用多线程的目的:提高应用程序?利用率. 多线程与多进程区别:进程间内存独立:同一个进程的线程间共享"堆内存和方法区内存" ...
- RHCS(概念篇)
一. 什么是RHCS RHCS是Red Hat Cluster Suite的缩写,也就是红帽子集群套件,RHCS是一个能够提供高可用性.高可靠性.负载均衡.存储共享且经济廉价的集群工具集合,它将集群系 ...
- tiny4412 --Uboot移植(3) 时钟
开发环境:win10 64位 + VMware12 + Ubuntu14.04 32位 工具链:linaro提供的gcc-linaro-6.1.1-2016.08-x86_64_arm-linux-g ...
- c#npoi 报错Cannot get a numeric value from a text cell 的解决
一般是因为cell里边的值为数字导致,有时变成文本格式还是解决不了这个问题. 下边的代码是c# 改变设置cell类型的方法 是用这个参数 CellType.String Row.GetCell((in ...
- playframework 一步一步来 之 日志 (二)
带着之前的疑问,我们先回顾一下日志相关的知识: 首先是SL4J,SL4J是个什么东西来着?官方解释为:“The Simple Logging Facade for Java (SLF4J) serve ...
- MySQL5.7 Group Replication (MGR)--Mysql的组复制之多主模式
MGR——Mysql的组复制之多主模式 以下测试在VMware环境: 操作系统:Centos 6.9 X86_64 数据库:Mysql 5.7 (mysql Ver 14.14 Distrib 5. ...
- Java集合:HashSet的源码分析
Java集合---HashSet的源码分析 一. HashSet概述: HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持.它不保证set 的迭代顺序:特别是它不保证该 ...