Codeforces182D - Common Divisors(KMP)

题目大意

如果把字符串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\n");

                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\n",ans);

    }

    else

        printf("0\n");

    return 0;

}

你可能感兴趣的:(codeforces)