zoukankan      html  css  js  c++  java
  • Codeforces Round #117 (Div. 2) D.Common Divisors(KMP最小循环节)

    http://codeforces.com/problemset/problem/182/D

    题意:
    如果把字符串a重复m次可以得到字符串b,那么我们称字符串a为字符串b的一个因子,现在给定两个字符串S1和S2,求它们的公共因子个数。

    思路:

    先求最小循环节,如果最小循环节不同,那么肯定是没有公共因子的。如果相同的话,那就看循环节长度为1,2,3...是否可行。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 using namespace std;
     5 const int maxn = 1e5+5;
     6 
     7 char s1[maxn],s2[maxn];
     8 int f1[maxn],f2[maxn];
     9 
    10 int getfail(char* s,int* f)
    11 {
    12     int m = strlen(s);
    13     f[0] = 0,f[1] = 0;
    14     for(int i=1;i<m;i++)
    15     {
    16         int j = f[i];
    17         while(j && s[i]!= s[j])  j = f[j];
    18         f[i+1] = s[i] == s[j]?j+1:0;
    19     }
    20     int loop = m - f[m];
    21     if(m%loop == 0)  return loop;
    22     else return m;
    23 }
    24 
    25 int main()
    26 {
    27     //freopen("in.txt","r",stdin);
    28     while(~scanf("%s%s",s1,s2))
    29     {
    30         int n1 = strlen(s1);
    31         int n2 = strlen(s2);
    32         int k1 = getfail(s1,f1);
    33         int k2 = getfail(s2,f2);
    34         if(k1!=k2)  {puts("0");return 0;}
    35         for(int i=0;i<k1;i++)
    36         {
    37             if(s1[i]!=s2[i])  {puts("0");return 0;}
    38         }
    39         int ans = 0;
    40         int t1 = n1/k1, t2 = n2/k2;
    41         for(int i=1;i<=t1 && i<=t2;i++)
    42             if(t1%i==0 && t2%i==0) ans++;
    43         printf("%d
    ",ans);
    44     }
    45     return 0;
    46 }
  • 相关阅读:
    mingw 构建 Geos
    nmake构建Geos库
    使用Dlib来运行基于CNN的人脸检测
    DLib Http Server程序示例
    DLib压缩解压程序示例
    GDAL添加ECW格式支持
    Dlib机器学习指南图翻译
    DLib库Base64编解码示例
    Dlib三维点云示例
    Mingw编译DLib
  • 原文地址:https://www.cnblogs.com/zyb993963526/p/7849966.html
Copyright © 2011-2022 走看看