正题

评测记录:https://www.luogu.org/recordnew/lists?uid=52918&pid=P3538


题目大意

给一个字符串,有q个询问,询问一个区间最短循环节。


解题思路

首先最短循环节长度一定长度的约数,所以我们可以枚举约数,然后判断循环节的话只需要(l,r−t)(l,r−t)(l,r-t)和(l+t,r)(l+t,r)(l+t,r)这段区间相等就好了,所以我们可以用hash表来O(1)O(1)O(1)来判断循环节。
时间复杂度:O(qn−−√)O(qn)O(q\sqrt{n})
然后在约数的地方我们用素数筛来做,将n−−√n\sqrt n的复杂度降低为了log nlognlog\ n
最终时间复杂度:O(q  log n)O(qlogn)O(q\ \ log\ {n})


code

#include<cstdio>
#define ull unsigned long long
using namespace std;
const int wer=13131,N=500005;
ull mul[N],hash[N];
bool use[N];
int next[N],prim[N/10],ys[N/10],n,m,l,r,k,tot;
char s[N];
void prime()//素数筛优化约数
{for(int i=2;i<=n;i++){if(!use[i]){prim[++k]=i;next[i]=i;}for(int j=1;j<=k&&(long long)prim[j]*i<=n;j++){next[prim[j]*i]=prim[j];use[prim[j]*i]=true;if(i%prim[j]==0){break;}}}
}
bool check(int l1,int r1,int l2,int r2)
{return hash[r1]-hash[l1-1]*mul[r1-l1+1]==hash[r2]-hash[l2-1]*mul[r2-l2+1];
}
int main()
{scanf("%d\n%s",&n,&s);mul[0]=1;for(int i=1;i<=n;i++){mul[i]=mul[i-1]*wer;hash[i]=hash[i-1]*wer+s[i-1]-'a'+1;}//哈希prime();scanf("%d",&m);for(int i=1;i<=m;i++){scanf("%d%d",&l,&r);int len=r-l+1;tot=0;while(len!=1){ys[++tot]=next[len];//记录素数len/=next[len];}len=r-l+1;for(int j=1;j<=tot;j++)//枚举约数{int t=len/ys[j];if(check(l,r-t,l+t,r)){len=t;}//判断}printf("%d\n",len);}
}

P3538-[POI2012]OKR-A Horrible Poem【hash,字符串】相关推荐

  1. #10038.A Horrible Poem

    #10038.A Horrible Poem 题目传送门 思路解析 既然这道题目在hash板块里,那么自然就可以想到用hash做这道题目. 首先我们可以用hash数组存储字符串的前缀的hash值. 因 ...

  2. C# Hash字符串

    C# Hash字符串 public static byte[] GetHash(string inputString) { HashAlgorithm algorithm = MD5.Create() ...

  3. A Horrible Poem(bzoj 2795)

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

  4. Python 负载均衡,数据轮询 hash字符串 hashlib

    在做数据分发轮询的时候遇到一个问题,我们并不只是想把数据依次分发到每台机器上,而是想根据每条数据的id来判断,同一个id的数据只放到同一个机器上,而不是可能随机出现在任何一台机器上. 1.使用pyth ...

  5. Hash——字符串Hash

    Hash 在学习本节课之前,请大家思考这样一个问题:如果我们要在一个长度为 N N N的随机整数序列 A A A中统计每个数出现的次数,可以用什么方法? 不难想到,我们可以建立一个数组 ,然后将整数序 ...

  6. 提高篇 第二部分 字符串算法 第1章 哈希和哈希表

    浅谈字符串哈希_1264Ikaros的博客-CSDN博客_字符串哈希 图书管理-哈希表_handsome·wjc的博客-CSDN博客 字符串哈希 哈希表 - DTTTTTTT - 博客园 图书管理(L ...

  7. matlab中随机森林实现,随机森林实现 MATLAB

    matlab 中随机森林工具箱的下载地址: http://code.google.com/p/randomforest-matlab/downloads/detail?name=Windows-Pre ...

  8. lua字符串转数组_深入Lua:字符串管理

    Lua的字符串对象表示为下面结构: typedef struct TString {CommonHeader;// 字符串的子类型有两种:长字符串和短字符串// 短字符串:extra表示Lua保留字的 ...

  9. 【lua学习】3.字符串

    [lua学习]3.字符串 Lua字符串的概况 字符串实现 字符串结构TString 全局字符串表stringtable 新建字符串luaS_newlstr (先查表,再决定创建与否) 新建字符串 ne ...

最新文章

  1. 手机短信验证码真的安全吗?
  2. Transformer用到3D点云分割
  3. IDE之Jupyter:交互式文档Jupyter Notebook简介、安装、使用方法详细攻略
  4. 通过软件测试周期说明不同测试的使用情况!
  5. for循环中gets_Python中for循环的一些非常规操作
  6. php会话控制区别和流程,PHP会话控制:cookie和session区别与用法深入理解_后端开发...
  7. vofuria的开发(3)将vuforia引入新建立的工程
  8. eclipse运行代码后变为红色和绿色
  9. Android resource compilation failed 一定能搞定的办法
  10. 道——为天地万物之总源头
  11. GPIO寄存器原理与操作
  12. unity 虚线 无视透视 近大远小
  13. C#-根据手机号获得相应的信息
  14. tp3.2使用QQ邮箱或163邮箱通过PHPMailer发送邮件
  15. mysql split 逗号分隔_mysql split函数用逗号分隔的实现
  16. CentOS7系统编码
  17. BB10 SDK离线安装步骤
  18. Numpy生成随机数及服从常见分布的随机数
  19. 计算机的软盘有没有磁性材料,磁性材料竟然还有如此惊人的历史!
  20. 小技巧--视频编辑会声会影安装

热门文章

  1. 3dsmax子菜单无法选择_3DsMax—用平面图片制作3D模型
  2. python可视化工具好用_6款Python必备的可视化工具推荐
  3. easyui 动态设置单元格控件_动态显示最大最小值的折线图
  4. leetcode509. 斐波那契数
  5. 33. 搜索旋转排序数组(013)二分查找+思路详解+来干了这杯代码!!!!!!
  6. [mybatis]动态sql_if_where_trim判断OGNL
  7. Honest Coach CodeForces - 1360B(简单贪心)
  8. Redis基础数据结构内部实现简单介绍
  9. python文本替换 数据库_在Python中使用ASCII文件中的注释查找/替换子...
  10. windows系统如何cmake_Windows操作系统如何快速增加分区?建议收藏