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 的奇幻冒险是一部非常火的漫画.漫画中的男主角经常喜欢连续喊很多的「欧拉」或者「木大」. 为了防止字太多挡住漫画内容,现在打算在新的漫画中用 ...
随机推荐
- ssh服务器配置
使用如下终端命令可以在 Linux 主机中安装 ssh服务器sudo apt-get install openssh-server lin@lin-machine:~$ sudo apt-get in ...
- Mac 系统下 mysql 的安装与配置
1.mysql 的安装 1)官网下载 mysql 安装包:http://www.mysql.com/downloads/ 2)下载后解压打开安装包,点击 pkg 文件进行安装 3)注意:最后一步弹窗会 ...
- Java中锁的实现与内存语义
目录 1. 概述 2. 锁的内存语义 3. 锁内存语义的实现 4. 总结 1. 概述 锁在实际使用时只是明白锁限制了并发访问, 但是锁是如何实现并发访问的, 同学们可能不太清楚, 下面这篇文章就来揭开 ...
- 数据库中多对多关系的处理 User---Role
--一个用户可以担任多个角色,如user1既是调度员又是分拣员--一个角色可以被多个用户担任,如user1是调度员,user2也是调度员--用户和角色之间的对应关系为多对多,所以会产生中间表 t_us ...
- DJango 基础 (2)
urls.py路由用法 知识点 url基本概念 url格式 urls.py的作用 url解析过程 include的作用 kwarg的作用 name的作用 URL概念 URL(Uniform Resou ...
- document.getElementById(“id”)与$("#id")的区别
document.getElementById("id")可以直接获取当前对象, jQuery利用$("#id")获取的是一个[object Object],需 ...
- 对话框改变颜色 宽度沾满屏幕 Dialog
首先在style.xml中定义一个对话框样式,这里可以修改颜色: //对话框沾满整个屏幕的宽度 <style name="DialogShareTheme" parent=& ...
- Codeforces Round #497 (Div. 2)
Codeforces Round #497 (Div. 2) https://codeforces.com/contest/1008 A #include<bits/stdc++.h> u ...
- VS2015 提示 无法启动 IIS Express Web 服务器
好久没有写东西了,不是没的写,是没时间了,今天快下班了,正好遇到这个一个问题,我就记录下来,以防忘记. 我定义了一个项目,Demo代码也写好了,然后,我们就把写好的项目代码加入到了源代码管理工具里.然 ...
- linux 查看信息-磁盘分区&网络
磁盘和分区 1.查看挂接的分区状态 2.查看所有交换分区 3.查看启动时IDE设备检测状况 网络 1.查看网络接口属性 2.查看防火墙设置 3.查看路由表 4.查看所有监听端口 5.查看所有已经建立的 ...