zoukankan      html  css  js  c++  java
  • Codeforces182D

    题目大意

    如果把字符串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;
    }
  • 相关阅读:
    去除百度搜索结果中的广告的 js 代码
    js获取url参数
    奇淫技巧
    js生成hash序列
    Maven中可以被继承的POM元素
    多线程
    IO在Socket中的应用
    关于IO的整理
    finalize方法的使用
    复合赋值和简单复制的区别
  • 原文地址:https://www.cnblogs.com/zjbztianya/p/3330836.html
Copyright © 2011-2022 走看看