bzoj 2795 [Poi2012]A Horrible Poem hash+线性筛
题目大意
bzoj 2795
给出一个由小写英文字母组成的字符串S,再给出q个询问,要求回答S某个子串的最短循环节。
如果字符串B是字符串A的循环节,那么A可以由B重复若干次得到。
n<=500,000 , q<=2,000,000
分析
判循环节用hash
\(O(q\sqrt n)\)枚举因子?
TLE
注意一个特殊的性质
若长度len可为循环节,则若(klen) | n,(klen)也为循环节
不会出现两个循环节长度互质除非1是循环节
由于已知整个串是循环节
于是我们可以枚举质因子判断循环节能否缩短
线性筛预处理一波
\(O(q\log n)\)
原理
每个循环节都可以被最短循环节复制k倍表示
所以从原串缩短的过程中,能被最短循环节表示的本质没变,依然可以继续缩短
(反证假设不可以被最短循环节表示,则有它们的gcd才是最短循环节)
至于证明如果长度A是循环节,长度B是循环节,那么gcd(A,B)也是循环节
根据扩欧,存在 Ax+By=g
且根据循环节定义\(S[i]=S[i+k_1A+k_2B]\)
则对于\(\forall i\)都有\(S[i]=S[i+Ax+By]=S[i+gcd(A,B)]\)
solution
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cmath>
#include <algorithm>
using namespace std;
typedef unsigned long long ull;
typedef long long LL;
const int M=500007;
const ull W=131;
inline int rd(){
int x=0;bool f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=0;
for(;isdigit(c);c=getchar()) x=x*10+c-48;
return f?x:-x;
}
int n,m;
char s[M];
ull hsh[M],pw[M];
int prime[M],cnt;
int vis[M];
int split[M][20];
void init(){
int i,j,k,t;
vis[1]=1;
for(i=2;i<M;i++){
if(!vis[i]){
prime[++cnt]=i;
split[i][0]=1;
split[i][1]=i;
}
for(j=1;j<=cnt;j++){
if((LL)i*prime[j]>=M) break;
t=i*prime[j];
vis[t]=1;
for(k=1;k<=split[i][0];k++) split[t][k]=split[i][k];
split[t][0]=split[i][0];
if(i%prime[j]==0) break;
split[t][++split[t][0]]=prime[j];
}
}
}
ull gethsh(int x,int y){
int len=y-x+1;
return hsh[y]-hsh[x-1]*pw[len];
}
int main(){
int i,j,x,y,len,z,tp,pri;
n=rd();
scanf("%s",s+1);
m=rd();
init();
for(hsh[0]=0,i=1;i<=n;i++) hsh[i]=hsh[i-1]*W+s[i];
for(pw[0]=1,i=1;i<=n;i++) pw[i]=pw[i-1]*W;
while(m--){
x=rd(),y=rd();
len=y-x+1;
z=len;
for(j=1;j<=split[z][0];j++){
pri=split[z][j];
while(len%pri==0){
tp=len/pri;
if(gethsh(x,y-tp)!=gethsh(x+tp,y)) break;
len/=pri;
}
}
printf("%d\n",len);
}
return 0;
}
bzoj 2795 [Poi2012]A Horrible Poem hash+线性筛的更多相关文章
- BZOJ 2795: [Poi2012]A Horrible Poem( hash )
...字符串hash. 假如长度x是一个循环节, 那么对于任意n(x | n)也是一个循环节. 设当前询问区间[l, r]长度为len = ∏piai, 最终答案ans = ∏piai' ,我们只需枚 ...
- bzoj 2795 [Poi2012]A Horrible Poem hash+数论
2795: [Poi2012]A Horrible Poem Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 640 Solved: 322[Subm ...
- 2795: [Poi2012]A Horrible Poem
2795: [Poi2012]A Horrible Poem Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 484 Solved: 235[Subm ...
- 【BZOJ2795】[Poi2012]A Horrible Poem hash
[BZOJ2795][Poi2012]A Horrible Poem Description 给出一个由小写英文字母组成的字符串S,再给出q个询问,要求回答S某个子串的最短循环节.如果字符串B是字符串 ...
- 【bzoj2795】[Poi2012]A Horrible Poem Hash+分解质因数
题目描述 给出一个由小写英文字母组成的字符串S,再给出q个询问,要求回答S某个子串的最短循环节.如果字符串B是字符串A的循环节,那么A可以由B重复若干次得到. 输入 第一行一个正整数n (n<= ...
- BZOJ2795&2890&3647[Poi2012]A Horrible Poem——hash
题目描述 给出一个由小写英文字母组成的字符串S,再给出q个询问,要求回答S某个子串的最短循环节.如果字符串B是字符串A的循环节,那么A可以由B重复若干次得到. 输入 第一行一个正整数n (n<= ...
- 【BZOJ】2795: [Poi2012]A Horrible Poem
题意 一个长度为\(n(n \le 500000)\)的字符串\(s\),给\(q(q \le 2000000)\)个询问,每个询问给一个区间\([l, r]\),求这个区间内最短的循环节. 分析 分 ...
- [POI2012]OKR-A Horrible Poem hash
题面:洛谷 题解: 首先我们需要知道一个性质,串s的最小循环节 = len - next[len].其中next[len]表示串s的一个最长长度使得s[1] ~ s[next[len]] == s[l ...
- P3538 [POI2012]OKR-A Horrible Poem
P3538 [POI2012]OKR-A Horrible Poem hash+线性筛 题解 <----这篇写的不错(其实是我懒得码字了qwq) UVA10298 Power Strings 的 ...
随机推荐
- 如何使用动画库animate.css
animate.css是一个CSS3动画库,里面预设了抖动(shake).闪烁(flash).弹跳(bounce).翻转(flip).旋转(rotateIn/rotateOut).淡入淡出(fadeI ...
- iOS或Mac开发者应该记住的前缀
- Deepgreen DB 是什么(含Deepgreen和Greenplum下载地址)
Deepgreen官网下载地址:http://vitessedata.com/products/deepgreen-db/download/ 不需要注册 Greenplum官网下载地址:https:/ ...
- Android读书笔记四
第四章 这是一次源代码之旅,学到了如何下载和编译Android源代码和Linux内核源代码.来详细阐述一下一些具体过程 一.Android源代码下载环境 1.安装下载Android源代码的环境配置 ( ...
- cena 测评机下载地址
以下是cane的下载地址,现在分享给你们,希望有所帮助 下载地址百度云:https://pan.baidu.com/s/1JBXiVSZy-jhIc0V-F2ESPA 密码:hgtk 点击下载即可. ...
- NOIP模拟赛 密室逃脱
密室逃脱(maze.*) 即使czhou没有派出最强篮球阵容,机房篮球队还是暴虐了校篮球队.为了不打击校篮球队信心,czhou决定改变训练后的活动.近来,江大掌门的徒弟徒孙们纷纷事业有成,回到母校为机 ...
- 【Python学习之五】高级特性5(切片、迭代、列表生成器、生成器、迭代器)
5.迭代器 由之前的生成器可知,for循环用于可迭代对象:Iterable.包括集合数据类型: list.tuple.dict.set.str 等,以及两种生成器.判断迭代器,使用 isinstanc ...
- 编译与安装 OpenSSL
编译与安装 OpenSSL prefix 是安装目录,openssldir 是配置文件目录,另外建议安装两次,shared 作用是生成动态连接库.linux版的OpenSSL下载地址为:https:/ ...
- jenkins的构建项目配置
继http://www.cnblogs.com/yajing-zh/p/5109517.html搭建好jenkins系统配置之后,新建jenkins构建项目,用于自动化构建. 点击Jenkins界面左 ...
- HDU 5468 Puzzled Elena 莫比乌斯反演
题意: 给出一棵树,每个点上有权值.然后求每棵子树中与根节点互质( \(gcd(a, b) = 1\) )的节点个数. 分析: 对于一颗子树来说,设根节点的权值为\(u\), \(count_i\)表 ...