【题目链接】

# 10038. 「一本通 2.1 练习 4」A Horrible Poem

【参考博客】

A Horrible Poem (字符串hash+数论)


【题目描述】

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

【算法】-首先对于长度为 lenlen 的子串,循环节长度为 xx 的充要条件:[1,len−x][1,len−x]串的哈希值等于 [x+1,len][x+1,len] 串的哈希值。

假设最短循环节长度为len则原串长度显然为len*k。若只考虑k,并且将k的质因数依次分解,每次试除k,则得到的k。k。和len的乘积仍是循环节,利用这个性质。依次用质因数 ii 试除n,若除去后仍是循环节,说明i属于k,将其除去,结果就留下了len。

【代码】:

 #include<cstdio>
#include<bitset>
#include<cstring>
#include<algorithm>
using namespace std;
typedef unsigned long long ULL ;
const int N = 5e5+;
ULL h[N],p[N],base = ; char str[N];
int n,m,len,ans,tmp,L,R; int prime[N],Min_p[N],cnt;
void Init(){
//memset( is_prime , true , sizeof is_prime );
int tot = ;
for(int i=;i<N;i++) {
if(!Min_p[i]) {
//if( i < 10 ) printf("%d\n",i);
prime[++tot]=i;
Min_p[i]=i;
}
for(int j=;j<=tot;j++) {
if(prime[j]>Min_p[i]||prime[j]*i>N) break;
Min_p[prime[j]*i]=prime[j];
}
}
cnt = tot ;
} void get_Hash(){
p[] = ;
for(int i=;i<=len;i++){
p[i] = p[i-] * base ;
h[i] = h[i-] * base + (ULL) str[i];
}
} bool Vaild( int L , int R , int k ){
return h[R] - h[L+k-] * p[len-k] == h[L + (len/k-)*k - ] - h[L-] * p[len-k] ;
}
int main()
{
Init();
//for(int i=1;i<10;i++) printf("%d\n",prime[i]);
scanf("%d%s%d",&n,str+,&m); len = strlen( str+ ) ;
get_Hash();
/*
for(int i=1;i<=len;i++){
printf("%llu\n",h[i]);
}
*/
while( m-- ){
scanf("%d%d",&L,&R);
len = tmp = ans = R - L + ;
while( tmp != ){
int k = Min_p[tmp] ;
while( tmp % k == && Vaild(L,R,ans/Min_p[tmp] ) )
tmp /= k , ans /= k ;
while( tmp % k == )
tmp /= k ;
}
printf("%d\n",ans);
}
return ;
}

【hash】A Horrible Poem的更多相关文章

  1. 【题解】A Horrible Poem

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

  2. 【bzoj2795】【Poi2012】A Horrible Poem

    题解: 询问区间的整循环节 设区间长度为$n$ 如果有循环节长为$x$和$y$,那由斐蜀定理得$gcd(x,y)$也一定为一个循环节: 假设最小的循环节长为$mn$,那么对于任何循环节长$x$,一定$ ...

  3. 【hash】BZOJ3751-[NOIP2014]解方程

    [题目大意] 已知多项式方程:a0+a1*x+a2*x^2+...+an*x^n=0.求这个方程在[1,m]内的整数解(n和m均为正整数). [思路] *当年考场上怒打300+行高精度,然而没骗到多少 ...

  4. 【hash】Power Strings

    [题意]: 给出s串出来,能否找到一个前缀 ,通过多次前缀进行拼接.构成s串.如果有多个,请输出最多次数那个. 如:aaaa 可以用1个a,进行4次拼接 可以用2个a,进行2次拼接 可以用4个a,进行 ...

  5. 【hash】Similarity of Subtrees

    图片来源: https://blog.csdn.net/dylan_frank/article/details/78177368 [题意]: 对于每一个节点来说有多少对相同的子树. [题解]: 利用层 ...

  6. 【hash】Seek the Name, Seek the Fame

    [哈希和哈希表]Seek the Name, Seek the Fame 题目描述 The little cat is so famous, that many couples tramp over ...

  7. 【hash】Three friends

    [来源]:bzoj3916 [参考博客] BZOJ3916: [Baltic2014]friends [ 哈希和哈希表]Three Friends [Baltic2014][BZOJ3916]frie ...

  8. 湖南师范大学2018年大学生程序设计竞赛新生赛 A 齐神和心美的游戏【hash】

    [链接]:A [题意]:给你n个数的序列和k.判断是否可以三个数组成k(同一个数可以拿多次) [分析]:每个数vis记录一下.2层循环.两数之和不超过k以及剩下的数出现在序列中那么ok. [代码]: ...

  9. 【hash】珍珠

    [来源] https://loj.ac/problem/2427 [参考博客] LOJ#2427. 「POI2010」珍珠项链 Beads [题解]: 复杂度计算: 暴力枚举k每次计算是n/2+n/3 ...

随机推荐

  1. Java基础_死锁、线程组、定时器Timer

    一.死锁问题: 死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放.由于线程被无限期地阻塞,因此程序不可能正常终止. 比如,线程一需要第一把所,此时锁处于空闲状态,给了 ...

  2. Vue.js 生命周期、计算属性及侦听器

    一.创建一个Vue实例 每个Vue应用都是使用Vue函数创建一个Vue实例.所有的Vue组件都是一个Vue实例,并且接受相同的选项对象(一些根实例特有的选项除外). 数据和方法 当一个实例被创建后,它 ...

  3. 客户端连接虚拟机上的MYSQL报错

    这个原因是因为虚拟机的数据库拒绝其他主机访问 所以需要设置虚拟机的mysql 打开mysql mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' ID ...

  4. MS SQL 数据类型转换

    MS SQL 转换数据类型 select cast(列A as int) 列A select convert(int,列A) 列A --转字符串为int select len(ltrim(str('数 ...

  5. springBoot2.X---过滤器,监听器,拦截器

    过滤器,监听器,拦截器 一.画图理解 过滤器(filter),监听器(listener),拦截器(Interceptor). 通过两幅图我们可以理解拦截器和过滤器的特点 1.过滤器 过滤器是在请求进入 ...

  6. LC 265. Paint House II

    There are a row of n houses, each house can be painted with one of the k colors. The cost of paintin ...

  7. 软件-绘图-AutoCAD:百科

    ylbtech-软件-绘图-AutoCAD:百科 AutoCAD(Autodesk Computer Aided Design)是Autodesk(欧特克)公司首次于1982年开发的自动计算机辅助设计 ...

  8. <application>节点属性

    1.android:allowBackup 它表示是否允许应用程序参与备份.如果将该属性设置为false,则即使备份整个系统,也不会执行这个应用程序的备份操作,而整个系统备份能导致所有应用程序数据通过 ...

  9. Python实现的计算马氏距离算法示例

    Python实现的计算马氏距离算法示例 本文实例讲述了Python实现的计算马氏距离算法.分享给大家供大家参考,具体如下: 我给写成函数调用了 python实现马氏距离源代码:     # encod ...

  10. 学一学Transfomer

    017年,Google发表论文<Attention is All You Need>,提出经典网络结构Transformer,全部采用Attention结构的方式,代替了传统的Encode ...