P3538 [POI2012]OKR-A Horrible Poem

摘要:
inlineintInt(){charc=getchar();intx=0;while(isdigit(c))x=(x<3)+(x&llt;c=getchar();}constantbase=19260817;=cnt;}intmain(){n=Int();=n;fac[i]=fac[i-1]*base;++i){l=Int(();r=Int(;len/=v[len];r))len=u;

P3538 [POI2012]OKR-A Horrible Poem

hash+线性筛

题解 <----这篇写的不错(其实是我懒得码字了qwq)

UVA10298 Power Strings 的升级版

判断一个长为 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=0;
    while(!isdigit(c)) c=getchar();
    while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=getchar();
    return x;
}
const int base=19260817;
int n,q,cnt,v[500002],prime[500002],it_pri[500002];
char a[500002];
ull h1[500002],fac[500002]; //自然溢出hash
void get_prime(){ //线性筛筛素数
    for(int i=2;i<=n;++i){
        if(!v[i]) prime[++cnt]=v[i]=i;
        for(int j=1;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-1]*fac[r1-l1+1];
    ull p2=h1[r2]-h1[l2-1]*fac[r2-l2+1];
    return p1==p2;
}
int main(){
    n=Int(); scanf("%s",a); fac[0]=1;
    for(int i=1;i<=n;++i){
        h1[i]=h1[i-1]*base+(ull)a[i-1];
        fac[i]=fac[i-1]*base;
    } //普通的hash
    get_prime();
    q=Int(); int l,r;
    for(int i=1;i<=q;++i){
        l=Int(); r=Int();
        int t=0,len=r-l+1;
        while(len>1) it_pri[++t]=v[len],len/=v[len]; //分解质因数
        len=r-l+1;
        for(int j=1;j<=t;++j){ 
            int u=len/it_pri[j];
            if(check(l,r-u,l+u,r)) len=u; //不断缩小循环子串的最小值
        }
        printf("%d
",len);
    }
    return 0;
}

免责声明:文章转载自《P3538 [POI2012]OKR-A Horrible Poem》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Zabbix监控USG6300防火墙及交换机java 错误 classes路径配置错误下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

python学习——re模块

re模块 findall***** 返回列表,找所有的匹配结果 语法:findall('正则表达式','待匹配字符串',flag) search***** 返回一个内存地址,这是一个正则匹配的结果span是索引,match是匹配结果,通过group取值;没有对应匹配结果就返回None,group会报错 语法:search(‘正则表达式’,‘待匹配字符串...

kettle控件 add a checksum

This step calculates checksums for one or more fields in the input stream and adds this to the output as a new field. 为数据流输入的列计算校验码,并将输出作为新的一列。 wiki中介绍:http://wiki.pentaho.com/dis...

Linux shell入门基础(二)

二、shell对文本的操作 01.查看文本的命令 #cat /etc/passwd(并非对文本文件操作) #tail -5 /etc/passwd(查看末尾5行) #tail -f /var/log/messages(对日志文件监视) 02.使用正则表达式的命令 #cat  sdkjfalkdsjf sdkjfalkdsjf ieakjnhgalkdsj...

JS实现跟随鼠标的魔法文字

JS学习资料时,看到的有趣的代码,文字随着鼠标的移动而移动!贴一下源码,分享一下! <html> <head> <title> 跟随鼠标的魔法文字</title> <SCRIPT language=JavaScript1.2> var msg='看的见我的漂移吗?'; var msgColor='...

IOS UIImage类方法总结

IOS中对图片的处理 UIImage 相信做项目时肯定会有用到 UIImage 这个类,那我们就来看一下这个类中都有什么内容。 其实这篇文章就是在看文档的时候想记录一下文档中得方法。 UIImage 继承于NSObject 下面介绍一下UIImage中的方法 首先是我们最常用的 通过图片的文件名来获取这个图片 + (UIImage *)imageNa...

SQL Server 一些使用小技巧

1、查询的时候把某一个字段的值拼接成字符串 以下是演示数据。 第一种方式:使用自定义变量 DECLARE @Names NVARCHAR(128) SET @Names='' -- 需要先赋值为空字符串,不然结果会是 null SELECT @Names=@Names+S_Name+',' -- S_Name 类型为...