分析:求两个字符串公共循环节的个数。
可以肯定的是,如果两个字符串有公共循环节,那么最短的循环节一定都是len-Next[len]长度。
首先我们求出两个串的最短循环节长度,然后进行比对,如果符合。不断的增加长度,并要满足循环节长度是两个字符串长度的公约数。
代码如下:
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const int maxn = 1e5+10;
int Next[maxn];
char s1[maxn],s2[maxn];
int n,m;
int x,y;
int ans;
void get_next(char *s, int len){
Next[0] = Next[1] = 0;
int j = 0;
for (int i=1; i<len; i++) {
while (j && s[i]!=s[j]) j = Next[j];
if (s[j]==s[i]) j++;
Next[i+1] = j;
}
}
void init(){
n = strlen(s1);
m = strlen(s2);
get_next(s1,n);
if (Next[n] && n%(n-Next[n])==0) x = n-Next[n]; else x = n;
get_next(s2,m);
if (Next[m] && m%(m-Next[m])==0) y = m-Next[m]; else y = m;
}
int MIN(int x, int y){return x<y?x:y;}
void solve(){
ans = 0;
if (x!=y) return;
for (int i=0; i<x; i++) if (s1[i]!=s2[i]) return;
int L = MIN(n,m);
int z = x;
while (z<=L){
if (n%z==0 && m%z==0) ans++;
z += x;
}
}
int main(){
while (scanf("%s%s",s1,s2)!=EOF){
init();
solve();
printf("%d\n",ans);
}
return 0;
}