题目大意
如果把字符串a重复m次可以得到字符串b,那么我们称字符串a为字符串b的一个因子,现在给定两个字符串S1和S2,求它们的公共因子个数
题解
如果它们有公共因子,那么显然它们的最小公共因子肯定是相等的~~~,公因子就是字符串的最短循环节~~~所以我们先把两个最短循环节给求出来,并判断是否相同,如果相同的话就是它们的最小公因子,然后所有的最小公因子的倍数并且是S1和S2的公约数都是它们的公因子
代码:
#include <iostream> #include <cstring> #include <algorithm> #include <cstdio> #include <string> using namespace std; string T,s1,s2; int f[100005]; void getfail(string s) { int j,len=s.length(); f[0]=j=-1; for(int i=1;i<len;i++) { while(j>=0&&s[j+1]!=s[i]) j=f[j]; if(s[j+1]==s[i]) j++; f[i]=j; } } int main() { int a,b; cin>>s1>>s2; int n=s1.length(),m=s2.length(); getfail(s1); if(n%(n-1-f[n-1])==0)a=n-1-f[n-1]; else a=n; getfail(s2); if(m%(m-1-f[m-1])==0)b=m-1-f[m-1]; else b=m; if(a==b) { for(int i=0;i<a;i++) if(s1[n-i-1]!=s2[m-i-1]) { printf("0 "); return 0; } int ans=0,t=a,ll=min(n,m); while(t<=ll) { if(n%t==0&&m%t==0) ans++; t+=a; } printf("%d ",ans); } else printf("0 "); return 0; }