Description

给出一个由小写英文字母组成的字符串S,再给出q个询问,要求回答S某个子串的最短循环节。
如果字符串B是字符串A的循环节,那么A可以由B重复若干次得到。

Input

第一行一个正整数n (n<=500,000),表示S的长度。
第二行n个小写英文字母,表示字符串S。
第三行一个正整数q (q<=2,000,000),表示询问个数。
下面q行每行两个正整数a,b (1<=a<=b<=n),表示询问字符串S[a..b]的最短循环节长度。

Output

依次输出q行正整数,第i行的正整数对应第i个询问的答案。

Sample Input

8
aaabcabc
3
1 3
3 8
4 8

Sample Output

1
3
5
/*挑了半天,原来是hash判断写错了,无语。首先我们可以知道,一个长度为len的子串,它的循环节一定是len的约数,所以只要找len的约数,再用hash判断就行了。但是这样的复杂度是q√n的,会TLE,所以考虑优化。考虑如果有一个字母出现了k次,那么这个子串的循环节个数一定是k的约数,我们把所有的k取一个gcd,再找约数。
*/
#include<cstdio>
#include<iostream>
#include<algorithm>
#define P 31
#define N 500010
#define lon long long
using namespace std;
int cnt[N][26],n,m,ans;
char s[N];
lon hash[N],base[N];
void get_hash(){base[0]=1;for(int i=1;i<=n;i++){hash[i]=hash[i-1]*P+s[i]-'a';base[i]=base[i-1]*P;}
}
void check(int x,int y,int t){lon has1=hash[y-t]-hash[x-1]*base[y-x+1-t];lon has2=hash[y]-hash[x+t-1]*base[y-x+1-t];if(has1==has2)ans=min(ans,t);
}
int main(){scanf("%d%s%d",&n,s+1,&m);get_hash();for(int j=0;j<=25;j++)for(int i=1;i<=n;i++)cnt[i][j]=cnt[i-1][j]+(s[i]-'a'==j);for(int i=1;i<=m;i++){ans=N;int x,y,vgcd;scanf("%d%d",&x,&y);vgcd=y-x+1;for(int j=0;j<=25;j++)vgcd=__gcd(vgcd,cnt[y][j]-cnt[x-1][j]);for(int j=1;j*j<=vgcd;j++){if(vgcd%j)continue;check(x,y,(y-x+1)/j);check(x,y,(y-x+1)/(vgcd/j));}printf("%d\n",ans);}return 0;
}

转载于:https://www.cnblogs.com/harden/p/6244859.html

A Horrible Poem(bzoj 2795)相关推荐

  1. 分裂游戏(bzoj 1188)

    Description 聪聪和睿睿最近迷上了一款叫做分裂的游戏. 该游戏的规则试: 共有 n 个瓶子, 标号为 0,1,2.....n-1, 第 i 个瓶子中装有 p[i]颗巧克力豆,两个人轮流取豆子 ...

  2. 洛谷 P3159(BZOJ 2668)[CQOI2012]交换棋子

    有一个\(n\)行\(m\)列的黑白棋盘,你每次可以交换两个相邻格子(相邻是指有公共边或公共顶点)中的棋子,最终达到目标状态.要求第\(i\)行第\(j\)列的格子只能参与\(m[i][j]\)次交换 ...

  3. 飞镖(bzoj 2335)

    Description 飞镖是在欧洲颇为流行的一项运动.它的镖盘上分为20个扇形区域,分别标有1到20的分值,每个区域中有单倍.双倍和三倍的区域,打中对应的区域会得到分值乘以倍数所对应的分数.例如打中 ...

  4. OSU!(bzoj 4318)

    Description osu 是一款群众喜闻乐见的休闲软件.  我们可以把osu的规则简化与改编成以下的样子:  一共有n次操作,每次操作只有成功与失败之分,成功对应1,失败对应0,n次操作对应为1 ...

  5. 亚瑟王(bzoj 4008)

    Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂 亮.众所周知,亚瑟王是一 ...

  6. GT考试(bzoj 1009)

    Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字. 他的不吉利数学A1A2...Am(0< ...

  7. 切糕(bzoj 3144)

    Description Input 第一行是三个正整数P,Q,R,表示切糕的长P. 宽Q.高R.第二行有一个非负整数D,表示光滑性要求.接下来是R个P行Q列的矩阵,第z个 矩阵的第x行第y列是v(x, ...

  8. 文本生成器(bzoj 1030)

    Description JSOI交给队员ZYX一个任务,编制一个称之为"文本生成器"的电脑软件:该软件的使用者是一些低幼人群, 他们现在使用的是GW文本生成器v6版.该软件可以随机 ...

  9. XWW的难题(bzoj 3698)

    Description XWW是个影响力很大的人,他有很多的追随者.这些追随者都想要加入XWW教成为XWW的教徒.但是这并不容易,需要通过XWW的考核. XWW给你出了这么一个难题:XWW给你一个N* ...

最新文章

  1. 不用中间变量交换两个变量的值
  2. ubuntu postgresql 的安装
  3. C++可重载运算符和不可重载运算符
  4. python真的是吹过了-python是否被过度吹捧?
  5. A2D JS框架 - loadScript实现
  6. Pcshare驱动级木马及查杀
  7. 计算机电路基础 - 1,计算机电路基础1.1(4页)-原创力文档
  8. 汉服php素材,【福利】汉服裁剪制作图——收录大全
  9. Python os.popen() 方法
  10. 堆糖生活家喜欢的图片批量下载
  11. ubuntu 20.04配置fcitx5添加五笔拼音教程
  12. PPT中插入的图片如何铺满整页
  13. 表单下的botton如何禁止提交
  14. C语言程序设计第五次作业——循环结构(1)
  15. 判断机器大端还是小端
  16. Python-Opencv实现魔方边缘识别
  17. 微软准备再次裁员2850人 一年之内完成
  18. 喜!人民币入篮;忧!欧央行下调。【济南中金点评 www.zjzx01.com】
  19. Elasticsearch 7.X索引、文档基本操作
  20. 计算网络地址和广播地址

热门文章

  1. linux 下常见启动文件配置
  2. android用户界面之TabHost教程实例汇总
  3. 第二届清华大学项目管理精英训练营【敏捷个人】分享
  4. CCNet 的 Build 流程
  5. JavaScript之Unspecified error或无法设置selected属性。未指明的错误。解决方案
  6. taobao sass
  7. MathType支持64位 WIN 7Office 2013(完美解决)(转载)
  8. 《七笔勾》--陕北风光
  9. virtualbox 安装ubuntu 时,看不到继续、退出按钮?共享文件无权限?
  10. 第七周项目一-一般函数(2)