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;
    }
  • 相关阅读:
    ssh整合
    自定义Java集合
    java图形界面写个小桌面,内置简单小软件
    java简单日历
    javaSwing
    javaScript封装
    java解析xml文件
    缺省适配器
    适配器模式
    自定义SWT控件一之自定义单选下拉框
  • 原文地址:https://www.cnblogs.com/zjbztianya/p/3330836.html
Copyright © 2011-2022 走看看