P3538 [POI2012]OKR-A Horrible Poem
P3538 [POI2012]OKR-A Horrible Poem
hash+线性筛
题解 <----这篇写的不错(其实是我懒得码字了qwq)
判断一个长为 u 的子串是否为 长为 n 的主串的循环子串 只要比较 [1,n-u ]和 [u+1, n]的hash值即可(所以说我以前都是瞎搞〒▽〒)
想了想,还是加点注释吧,不然为啥要写博客总结呢(逃
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cctype>
using namespace std;
typedef unsigned long long ull;
inline int Int(){
char c=getchar(); int x=;
while(!isdigit(c)) c=getchar();
while(isdigit(c)) x=(x<<)+(x<<)+(c^),c=getchar();
return x;
}
const int base=;
int n,q,cnt,v[],prime[],it_pri[];
char a[];
ull h1[],fac[]; //自然溢出hash
void get_prime(){ //线性筛筛素数
for(int i=;i<=n;++i){
if(!v[i]) prime[++cnt]=v[i]=i;
for(int j=;j<=cnt;++j){
if(prime[j]>v[i]||prime[j]>n/i) break;
v[prime[j]*i]=prime[j];
}
}
}
inline bool check(int l1,int r1,int l2,int r2){ //hash值比较
ull p1=h1[r1]-h1[l1-]*fac[r1-l1+];
ull p2=h1[r2]-h1[l2-]*fac[r2-l2+];
return p1==p2;
}
int main(){
n=Int(); scanf("%s",a); fac[]=;
for(int i=;i<=n;++i){
h1[i]=h1[i-]*base+(ull)a[i-];
fac[i]=fac[i-]*base;
} //普通的hash
get_prime();
q=Int(); int l,r;
for(int i=;i<=q;++i){
l=Int(); r=Int();
int t=,len=r-l+;
while(len>) it_pri[++t]=v[len],len/=v[len]; //分解质因数
len=r-l+;
for(int j=;j<=t;++j){
int u=len/it_pri[j];
if(check(l,r-u,l+u,r)) len=u; //不断缩小循环子串的最小值
}
printf("%d\n",len);
}
return ;
}
P3538 [POI2012]OKR-A Horrible Poem的更多相关文章
- 【bzoj2795】【Poi2012】A Horrible Poem
题解: 询问区间的整循环节 设区间长度为$n$ 如果有循环节长为$x$和$y$,那由斐蜀定理得$gcd(x,y)$也一定为一个循环节: 假设最小的循环节长为$mn$,那么对于任何循环节长$x$,一定$ ...
- 洛谷P3538 [POI2012]OKR-A Horrible Poem [字符串hash]
题目传送门 A Horrible Poem 题目描述 Bytie boy has to learn a fragment of a certain poem by heart. The poem, f ...
- 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
2795: [Poi2012]A Horrible Poem Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 261 Solved: 150[Subm ...
- 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 ...
- 【BZOJ2795】[Poi2012]A Horrible Poem hash
[BZOJ2795][Poi2012]A Horrible Poem Description 给出一个由小写英文字母组成的字符串S,再给出q个询问,要求回答S某个子串的最短循环节.如果字符串B是字符串 ...
- #10038.A Horrible Poem
#10038.A Horrible Poem 题目传送门 思路解析 既然这道题目在hash板块里,那么自然就可以想到用hash做这道题目. 首先我们可以用hash数组存储字符串的前缀的hash值. 因 ...
- 【hash】A Horrible Poem
[题目链接] # 10038. 「一本通 2.1 练习 4」A Horrible Poem [参考博客] A Horrible Poem (字符串hash+数论) [题目描述] 给出一个由小写英文字母 ...
随机推荐
- 被included或者被required的文件都来自哪里呢
过PHP,你可以使用不同函数帮助你重用代码.具体用到的函数取决于你打算重用的内容. 主函数如下: * include() and include_once() * require() and requ ...
- logstash实战filter插件之grok(收集apache日志)
有些日志(比如apache)不像nginx那样支持json可以使用grok插件 grok利用正则表达式就行匹配拆分 预定义的位置在 /opt/logstash/vendor/bundle/jruby/ ...
- hdu5692【dfs序】【线段树】
Snacks Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- OpenCV学习笔记之课后习题练习3-4
练习:创建一个大小为100*100的三通道RGB图像.将它的元素全部置0.使用指针算法以(20,5)与(40,20)为顶点绘制一个绿色平面. 参考博文:blog.csdn.net/qq_2077736 ...
- oracle11gR2 win7_32位客户端连接虚拟机中oracle11gR2 win7_32位服务器方法
改写服务器中的监听文件(listener.ora和tnsnames.ora) “ora-12541:TNS:无监听程序”问题的解决 ora-12541:TNS:无监听程序,出现这种错误的时候,可以尝试 ...
- linux 批量文件查找并替换
linux 批量文件查找并替换 sed -i "s/oldstring/newstring/g" `grep oldstring -rl path` 如: sed -i " ...
- sublime安装install package
通过 https://sublime.wbond.net/Package%20Control.sublime-package 下载packageControl文件 下载完成后,打开sublime te ...
- 2018/03/22 每日一个Linux命令 之 grep
Linux grep命令用于查找文件里符合条件的字符串. -- 最长用 搜索 指令,也常常用于 管道 搜索输出等,应用广泛. 这个命令的参数比较多,这里只介绍一部分比较常用的参数,具体的可以到 htt ...
- 迷宫城堡--hdu1269(连通图)
题目链接 连通图模板题: #include<cstdio> #include<cstdlib> #include<cmath> #include<iost ...
- vue中 用媒体查询 空置根节点字体大小
在index.html中 <style> @media all and (min-width: 0px) { html{font-size: 20px;}/* 12*4.6 */ } @m ...