http://codeforces.com/problemset/problem/182/D
题意:
如果把字符串a重复m次可以得到字符串b,那么我们称字符串a为字符串b的一个因子,现在给定两个字符串S1和S2,求它们的公共因子个数。
思路:
先求最小循环节,如果最小循环节不同,那么肯定是没有公共因子的。如果相同的话,那就看循环节长度为1,2,3...是否可行。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 const int maxn = 1e5+5; 6 7 char s1[maxn],s2[maxn]; 8 int f1[maxn],f2[maxn]; 9 10 int getfail(char* s,int* f) 11 { 12 int m = strlen(s); 13 f[0] = 0,f[1] = 0; 14 for(int i=1;i<m;i++) 15 { 16 int j = f[i]; 17 while(j && s[i]!= s[j]) j = f[j]; 18 f[i+1] = s[i] == s[j]?j+1:0; 19 } 20 int loop = m - f[m]; 21 if(m%loop == 0) return loop; 22 else return m; 23 } 24 25 int main() 26 { 27 //freopen("in.txt","r",stdin); 28 while(~scanf("%s%s",s1,s2)) 29 { 30 int n1 = strlen(s1); 31 int n2 = strlen(s2); 32 int k1 = getfail(s1,f1); 33 int k2 = getfail(s2,f2); 34 if(k1!=k2) {puts("0");return 0;} 35 for(int i=0;i<k1;i++) 36 { 37 if(s1[i]!=s2[i]) {puts("0");return 0;} 38 } 39 int ans = 0; 40 int t1 = n1/k1, t2 = n2/k2; 41 for(int i=1;i<=t1 && i<=t2;i++) 42 if(t1%i==0 && t2%i==0) ans++; 43 printf("%d ",ans); 44 } 45 return 0; 46 }