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 }
  • 相关阅读:
    asp.net mvc4 webapi request获取参数
    各种加密和解密算法的实现
    SQL 排序的简单用法
    aiofiles拆分大文件
    21.11.16模拟 学校
    P3178 [HAOI2015]树上操作
    21.11.16模拟 bzoj3306树
    SP1557 GSS2 Can you answer these queries II
    21.11.16模拟 问题
    21.11.16模拟 真菌
  • 原文地址:https://www.cnblogs.com/zyb993963526/p/7849966.html
Copyright © 2011-2022 走看看