洛谷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, following the best lines of modern art, is a long string consisting of lowercase English alphabet letters only. Obviously, it sounds horrible, but that is the least of Bytie's worries.
First and foremost, he completely forgot which fragment is he supposed to learn. And they all look quite difficult to memorize...
There is hope, however: some parts of the poem exhibit certain regularity. In particular, every now and then a fragment, say
, is but a multiple repetition of another fragment, say
(in other words,
, i.e.,
, where
is an integer). In such case we say that
is a full period of
(in particular, every string is its own full period).
If a given fragment has a short full period, Bytie's task will be easy. The question remains... which fragment was that?
Make a gift for Bytie - write a program that will read the whole poem as well as a list of fragments that Bytie suspects might be the one he is supposed to memorize, and for each of them determines its shortest full period.
给出一个由小写英文字母组成的字符串S,再给出q个询问,要求回答S某个子串的最短循环节。
如果字符串B是字符串A的循环节,那么A可以由B重复若干次得到。
输入输出格式
输入格式:
In the first line of the standard input there is a single integer
(
).
In the second line there is a string of length
consisting of lowercase English alphabet letters-the poem.
We number the positions of its successive characters from 1 to
.
The next line holds a single integer
(
) denoting the number of fragments.
Then the following
lines give queries, one per line.
Each query is a pair of integers
and
(
), separated by a single space, such that the answer to the query should be the length of the shortest full period of the poem's fragment that begins at position
and ends at position
.
In tests worth in total 42% of the points
holds in addition.
In some of those, worth 30% of points in total,
holds as well.
输出格式:
Your program should print
lines on the standard output.
The
-th of these lines should hold a single integer - the answer to the
-th query.
输入输出样例
8
aaabcabc
3
1 3
3 8
4 8
1
3
5
说明
给出一个由小写英文字母组成的字符串S,再给出q个询问,要求回答S某个子串的最短循环节。
如果字符串B是字符串A的循环节,那么A可以由B重复若干次得到。
分析:
一道稍考思维的字符串题目,一开始没想到第三条性质只能打出暴力。
本道题共有三个重要的性质,只要能想到也就不难写出来了:
1,循环节长度一定是区间长度的约数
2,如果n是一个循环节长度,那么k*n(当然k*n也要是区间长度的约数)也会是一个循环节长度
3,满足一个子串为该段字符串区间的循环节的充要条件是$[l,r-t]$与$[l+t,r]$的$hash$值相同,其中$t$是该子串的长度
有了上面三条性质也就不难做了。
首先预处理出$n$范围内的质因数,然后从大到小枚举区间长度的质因数,用性质3计算该长度的子串是不是循环节即可。当然,预处理需要用优化版的埃氏筛,否则会被愉快地T飞。。。
Code:
//It is made by HolseLee on 10th Aug 2018
//Luogu.org P3538
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<iomanip>
#include<algorithm>
#pragma GCC optimize(2)
using namespace std; typedef unsigned long long ull;
const int N=5e5+;
const ull base=;
ull h[N],a[N];
int n,m,nxt[N],q[N<<];
char s[N];
bool vis[N]; inline int read()
{
char ch=getchar();int num=;
while(ch<''||ch>'')ch=getchar();
while(ch>=''&&ch<=''){
num=num*+ch-'';ch=getchar();
}
return num;
} inline void print(int x)
{
if(x>)print(x/);
putchar(x%+'');
} void divisor()
{
int top=;
for(int i=;i<N;++i){
if(vis[i]){
for(int j=;j<=top&&(ull)(i*q[j])<N;++j){
nxt[i*q[j]]=q[j],
vis[i*q[j]]=true;
if(i%q[j]==)break;
}
}
else {
vis[q[++top]=i]=true;nxt[i]=i;
for(int j=;j<=top&&(ull)(i*q[j])<N;++j){
nxt[i*q[j]]=q[j],
vis[i*q[j]]=true;
}
}
}
} inline bool check(int l1,int r1,int l2,int r2)
{
return ((h[r1]-h[l1-]*a[r1-l1+])==(h[r2]-h[l2-]*a[r2-l2+]));
} int main()
{
n=read();
scanf("%s",s+);
for(int i=;i<=n;++i){
h[i]=h[i-]*base+s[i]-'a'+;
}
a[]=;
for(int i=;i<=n;++i){
a[i]=a[i-]*base;
}
divisor();
m=read();
int l,r,tot,len,t;
for(int i=;i<=m;++i){
l=read(),r=read();
len=r-l+;tot=;
while(len!=){
q[++tot]=nxt[len];
len/=nxt[len];
}
len=r-l+;
for(int j=;j<=tot;++j)
if(len>=q[j]){
t=len/q[j];
if(check(l,r-t,l+t,r)){
len=t;
}
}
print(len);putchar('\n');
}
return ;
}
洛谷P3538 [POI2012]OKR-A Horrible Poem [字符串hash]的更多相关文章
- 洛谷P3832 [NOI2017]蚯蚓排队 【链表 + 字符串hash】
题目链接 洛谷P3832 题解 字符串哈希然后丢到hash表里边查询即可 因为\(k \le 50\),1.2操作就暴力维护一下 经复杂度分析会发现直接这样暴力维护是对的 一开始自然溢出WA了,还以为 ...
- 洛谷 P3539 [POI2012]ROZ-Fibonacci Representation 解题报告
P3539 [POI2012]ROZ-Fibonacci Representation 题意:给一个数,问最少可以用几个斐波那契数加加减减凑出来 多组数据10 数据范围1e17 第一次瞬间yy出做法, ...
- 洛谷P3533 [POI2012]RAN-Rendezvous
P3533 [POI2012]RAN-Rendezvous 题目描述 Byteasar is a ranger who works in the Arrow Cave - a famous rende ...
- BZOJ2801/洛谷P3544 [POI2012]BEZ-Minimalist Security(题目性质发掘+图的遍历+解不等式组)
题面戳这 化下题面给的式子: \(z_u+z_v=p_u+p_v-b_{u,v}\) 发现\(p_u+p_v-b_{u,v}\)是确定的,所以只要确定了一个点\(i\)的权值\(x_i\),和它在同一 ...
- 【bzoj2795】【Poi2012】A Horrible Poem
题解: 询问区间的整循环节 设区间长度为$n$ 如果有循环节长为$x$和$y$,那由斐蜀定理得$gcd(x,y)$也一定为一个循环节: 假设最小的循环节长为$mn$,那么对于任何循环节长$x$,一定$ ...
- 洛谷P3539 [POI2012] ROZ-Fibonacci Representation
题目传送门 转载自:five20,转载请注明出处 本来看到这题,蒟蒻是真心没有把握的,还是five20大佬巨orz 首先由于斐波拉契数的前两项是1,1 ,所以易得对于任何整数必能写成多个斐波拉契数加减 ...
- 洛谷P3537 [POI2012]SZA-Cloakroom(背包)
传送门 蠢了……还以为背包只能用来维护方案数呢……没想到背包这么神奇…… 我们用$dp[i]$表示当$c$的和为$i$时,所有的方案中使得最小的$b$最大时最小的$b$是多少 然后把所有的点按照$a$ ...
- 洛谷P3531 [POI2012]LIT-Letters
题目描述 Little Johnny has a very long surname. Yet he is not the only such person in his milieu. As it ...
- 洛谷P3534 [POI2012] STU
题目 二分好题 首先用二分找最小的绝对值差,对于每个a[i]都两个方向扫一遍,先都改成差满足的形式,然后再找a[k]等于0的情况,发现如果a[k]要变成0,则从他到左右两个方向上必会有两个连续的区间也 ...
随机推荐
- hdu 4940 Destroy Transportation system (无源汇上下界可行流)
Destroy Transportation system Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 ...
- UVA 12063 Zeros and Ones
https://vjudge.net/problem/UVA-12063 题意: 统计n为二进制数中,0和1相等且值为m的倍数的数有多少个 dp[i][j][k] 前i位二进制 有j个1 值模m等于k ...
- 【BZOJ】1778: [Usaco2010 Hol]Dotp 驱逐猪猡
[题意]给定无向图,炸弹开始在1,在每个点爆炸概率Q=p/q,不爆炸则等概率往邻点走,求在每个点爆炸的概率.n<=300. [算法]概率+高斯消元 [题解]很直接的会考虑假设每个点爆炸的概率,无 ...
- JavaScript数据类型和转换
JavaScript数据类型 1.Boolean(布尔) 布尔:(值类型)var b1=true;//布尔类型 2.Number(数字) 数值:(值类型)var n1=3.1415926;//数值类型 ...
- Git其他的命令------(四)
git除了在工作当中可以进行对代码进行管理的设置之外,git的其他指令也偶尔会被用到~ 1:删除某一个文件: rm -rf node,然后按下tab 2:查看修改文件的修改的详细信息: git ...
- discuz 积分按日重新计算,(摒弃以前24小时计算)
修改\source\module\forum\forum_misc.php将 foreach(C::t('forum_ratelog')->fetch_all_sum_score($_G['ui ...
- linux device tree源代码解析--转
//Based on Linux v3.14 source code Linux设备树机制(Device Tree) 一.描述 ARM Device Tree起源于OpenFirmware (OF), ...
- 64_m3
molequeue-doc-0.8.0-2.20161222giteb397e.fc26.no..> 05-Apr-2017 10:04 451570 molequeue-libs-0.8.0- ...
- 读书笔记 effective c++ Item 3 在任何可能的时候使用 const
Const可以修饰什么? Const 关键字是万能的,在类外部,你可以用它修饰全局的或者命名空间范围内的常量,也可以用它来修饰文件,函数和块作用域的静态常量.在类内部,你可以使用它来声明静态或者非 ...
- 【IT公司笔试面试】75道逻辑推理题及答案
[1]假设有一个池塘,里面有无穷多的水.现有2个空水壶,容积分别为5升和6升.问题是如何只用这2个水壶从池塘里取得3升的水. 由满6向空5倒,剩1升,把这1升倒5里,然后6剩满,倒5里面,由于5里面有 ...