2795: [Poi2012]A Horrible Poem
2018-03-26 19:19
232 查看
题目链接
题目大意:给出一个长度为N的字符串,有Q次询问;
每次询问给出一个区间,求区间最短循环节长度
题解:膜一发GXZ大爷
我的收获:循环节……e
题目大意:给出一个长度为N的字符串,有Q次询问;
每次询问给出一个区间,求区间最短循环节长度
题解:膜一发GXZ大爷
我的收获:循环节……e
#include<bits/stdc++.h> using namespace std; typedef unsigned long long ull; const int N=500009; const ull B=1000173169; int n,q; int p ,lp ; char S ; bool vis ; ull Base ,H ; bool judge(int a,int b,int L){return H[a+L-1]-H[a-1]*Base[L]==H[b]-H[b-L]*Base[L];} void euler() { for(int i=2;i<=n;i++){ if(!vis[i]) lp[i]=i,p[++p[0]]=i; for(int j=1;j<=p[0]&&i*p[j]<=n;j++) { vis[i*p[j]]=1;lp[i*p[j]]=p[j]; if(i%p[j]==0) break; } } Base[0]=1;for(int i=1;i<=n;i++) Base[i]=Base[i-1]*B,H[i]=H[i-1]*B+S[i]; } void work() { for(scanf("%d",&q);q;q--){ int l,r;scanf("%d%d",&l,&r); int now=r-l+1,v=now; while(v!=1){ if(judge(l,r,r-l+1-now/lp[v])) now/=lp[v]; v/=lp[v]; } printf("%d\n",now); } } void init() { scanf("%d%s",&n,S+1); euler(); } int main() { init(); work(); return 0; }
相关文章推荐
- bzoj 2795: [Poi2012]A Horrible Poem (hash+数论)
- [BZOJ2795] [Poi2012] [字符串hash] A Horrible Poem
- BZOJ2795/POI2012 A horrible poem
- bzoj2795[Poi2012]A Horrible Poem 暴力hash
- BZOJ_2795_[Poi2012]A Horrible Poem_hash+暴力
- BZOJ 2795: [Poi2012]A Horrible Poem( hash )
- 2795: [Poi2012]A Horrible Poem
- [BZOJ 2795]POI2012 A Horrible Poem
- BZOJ2795: [Poi2012]A Horrible Poem
- 【BZOJ2795】[Poi2012]A Horrible Poem【Hash】【GCD】【暴力】
- 【BZOJ2795】[Poi2012]A Horrible Poem hash
- BZOJ 2795:[Poi2012]A Horrible Poem
- BZOJ2795: [Poi2012]A Horrible Poem
- 【BZOJ】2795: [Poi2012]A Horrible Poem
- BZOJ 2795 Poi2012 A Horrible Poem Hash
- bzoj 2795: [Poi2012]A Horrible Poem hash
- 【bzoj2795】[Poi2012]A Horrible Poem hash
- [BZOJ2795][Poi2012]A Horrible Poem
- 【POI2012】【BZOJ2795】A Horrible Poem
- bzoj2795: [Poi2012]A Horrible Poem