题目链接:
题目描述
定义两个字符串s1和s2的乘积s1*s2为将s1和s2连结起来得到的字符串。 例如:s1="xy",s2="z",那么s1*s2="xyz"。 由此可以定义s1的幂次:s1^0="",s1^n=s1*s1^(n-1),n>0。
输入
输入包含多组测试数据。 每组数据由一行构成,包含一个字符串s。 输入数据以"."结束。
输出
对于每组输入数据输出一行,找出最大的正整数n,使得存在某个字符串a,s = a^n.
样例输入
abcdaaaaababab.
样例输出
143 题解:字符串hash,然后枚举子串长度,。模板套一下就可以
//#include#include #include #include #include #include #define pb push_back#define ll long long#define ull unsigned long long#define rank wepsdas#define PI 3.14159265#define ls l,m,rt<<1#define rs m+1,r,rt<<1|1#define eps 1e-7using namespace std;const int base=23;const int N=1e6+100;const int mod=1e9+7;struct hash{ char s[N]; ull h[N],qp[N]; ll p[N],len,val[N]; void init() { h[0]=val[0]=0; qp[0]=p[0]=1; len=strlen(s+1); for(int i=1;i<=len;i++) { qp[i]=qp[i-1]*base; h[i]=h[i-1]*base+s[i]; } } ull get_hash(int l,int r) { return h[r]-h[l-1]*qp[r-l+1]; }}ac;bool judge(int l){ ull tmp=ac.get_hash(1,l); for(int i=l+1;i<=ac.len;i+=l) { if(tmp!=ac.get_hash(i,i+l-1))return false; } return true;}int main() { while(scanf("%s",ac.s+1)) { ac.init(); if(ac.len==1&&ac.s[1]=='.')break; // printf("%s",ac.s+1); //ŝ for(int i=) int ans=-1; for(int i=1;i<=ac.len;i++) { if(ac.len%i==0) { if(judge(i)) { ans=i;break; } } } printf("%d\n",ac.len/ans); } return 0;}