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;
}

posted on 2013-09-20 22:01  仗剑奔走天涯  阅读(575)  评论(0编辑  收藏  举报

导航