coderforce #round117D (kmp)

题目链接:

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

题意:

求两个字符串公共循环节的个数

题解:

利用kmp算法中的next数组求出两个字符串的最小循环节, 设字符串的长度为len,如果len%(len - next[len]) == 0就有最小循环节,最小循环节 = 原字符串.substr(0,len - next[len]),如果不等于0最小循环节就是字符串本身。然后求两个字符串各自循环次数的最小公倍数即可。

AC代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
string p,t;
int nxta[100050];
int nxtb[100050];
int m,mm,n,nn,result,k1,k2;
string s1,s2;
void getnext(string s, int nxt[])
{
    int i = 0, j = -1;
    nxt[0] = -1;
    m = s.size();
    while(i != m)
    {
        if(j == -1 || s[i] == s[j])
            nxt[++i] = ++j;
        else
            j = nxt[j];
    }
} //比较吊的
int gcd(int a, int b)
{
    return b==0?a:gcd(b,a%b);
}
int main()
{
    cin >> p;
    cin >> t;
    getnext(p,nxta);
    getnext(t,nxtb);
    nn = t.size();
    mm = p.size();
    s1 = p;
    s2 = t;
    if(mm % (mm - nxta[mm]) == 0)
    {
        int i = mm - nxta[mm];
        s1 = p.substr(0, i);
    }
    if(nn % (nn - nxtb[nn]) == 0)
    {
        int i = nn - nxtb[nn];
        s2 = t.substr(0, i);
    }
    if(s1 == s2)
    {
        k1 = s1.size();
        k2 = s2.size();
        int an1 = mm/k1;
        int an2 = nn/k2;
        int ii = gcd(an1,an2);
        result = 1;
        if(ii != 1)
        {
            for(int i = 1; i < ii; i++)
            {
                if(an1 % i == 0 && an2 % i == 0)
                {
                    result++;
                }
            }
        }
    }
    cout << result <<endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值