题目链接:点击查看

题目大意:给出两个字符串s和t,求这两个字符串有多少个公因子,规定若字符串n为其公因子,则:

  1. 设lens是字符串s的长度,lent是字符串t的长度,lenn是字符串n的长度,需要满足lent%n==0&&lens%n==0
  2. 字符串n必须在字符串s中出现lens/lenn次,在字符串t中出现lent/lenn次

题目分析:这个题目主要是有点抽象,经过上面的翻译就好懂很多了,我们只要求出满足上述条件的所有字符串n即可,那么现在问题来了,该怎么求呢?其实不难发现,所有的因子,都是基于字符串s和t的最小公因子,通过上述概念,我们不难延伸出两个字符串最小公因子的定义,换一种说法,也就是两个字符串的最小循环节

我们可以通过先求出两个字符串s和t的最大循环节长度,首先必须满足两个字符串是周期性字符串,然后再判断一下两者是否相等,若不相等则肯定不可能有最小公因子了,就更别说公因子了,若相等的话继续判断一下其循环节是否相等,若上述条件都满足的话,两个字符串的最小相同循环节就是其最小公因子了,我们通过给最小公因子不断加倍,就可以获得一共有多少个因子了,因为上面已经判断两个字符串都是周期性字符串了,所以到这里我们只需要根据长度来判断条件就可以了,每次让公因子的长度都增加最小循环节的长度,若当前的长度为i,则lens%i==0&&lent%i==0就说明当前的因子属于两者的公因子,让答案加一即可

代码:

#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
#include<unordered_map>
using namespace std;typedef unsigned long long ull;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1e5+100;string s1,s2;int nxa[N],nxb[N];void getnext(string s,int nx[])
{nx[0]=-1;int i=0,j=-1;while(i<s.size()){if(j==-1||s[i]==s[j])nx[++i]=++j;elsej=nx[j];}
}int main()
{
//  freopen("input.txt","r",stdin);ios::sync_with_stdio(false);cin>>s1>>s2;getnext(s1,nxa);getnext(s2,nxb);int na=s1.size();int nb=s2.size();int lena=na-nxa[na];if(na%lena!=0)//若不是周期性字符串,就让其长度等于本身lena=na;int lenb=nb-nxb[nb];if(nb%lenb!=0)lenb=nb;if(lena!=lenb)//如果两个字符串的最小循环节长度不相等,则肯定没有公因子cout<<0<<endl;else{string temp1=s1.substr(0,lena);//最小公因子 string temp2=s2.substr(0,lenb);if(temp1!=temp2)//如果最小循环节不相等,则肯定没有公因子cout<<0<<endl;else{int ans=0;for(int i=lena;i<=na&&i<=nb;i+=lena)//求一下有多少个最小公因子的倍数满足两者的公因子{if(na%i==0&&nb%i==0)ans++;}cout<<ans<<endl;}}return 0;
}

CodeForces - 182D Common Divisors(KMP的next数组)相关推荐

  1. CodeForces - 1137B Camp Schedule(KMP的next数组+构造)

    题目链接:点击查看 题目大意:给出一个主字符串s,再给出一个子字符串ss,主串和子串都是只由0或1所组成的字符串,现在要求重组主串s,要求重组后的字符串: 所包含的0与1的个数与之前保持一致 尽可能多 ...

  2. KMP中next数组的理解

    next数组是KMP的核心,但对于next数组我们总是有时候感觉明白了,但有时候又感觉没明白,现在我就说下我自己对KMP中next数组的理解,首先next[i]上的数字的意义,next[i]表示的是当 ...

  3. HDU - 1358 Period(KMP的next数组求最小循环节)

    题目链接:点击查看 题目大意:给出一个长度为n的字符串,问有哪些前缀是周期性字符串 题目分析:因为n给的很大,所以肯定不能暴力判断了,我们可以巧妙的利用kmp的next数组进行判断,next数组有一个 ...

  4. HDU - 3746 Cyclic Nacklace(KMP的next数组判循环节)

    题目链接:点击查看 题目大意:现在规定想要制作一串珍珠手链,需要用到两段一模一样的字符串首位相接而成,现在给定一个字符串,问最少需要添加几个珍珠才能满足条件 题目分析:一开始以为是个简单的模拟题,但后 ...

  5. KMP的Next数组应用总结

    Next数组求法 不用初始化,因为Next数组是递推出来的.用法为getFail(s,strlen(s)). const int MAX_N=101000; char str[MAX_N],patte ...

  6. Codeforces 432D Prefixes and Suffixes (KMP、后缀数组)

    题目链接: https://codeforces.com/contest/432/problem/D 题解: 做法一: KMP 显然next树上\(n\)的所有祖先都是答案,出现次数为next树子树大 ...

  7. CodeForces - 432D Prefixes and Suffixes(KMP的next数组性质)

    题目链接:点击查看 题目大意:给出一个字符串,求满足条件的所有子字符串在主串中出现的次数,条件就是当前子字符串在主串中既是前缀也是后缀 题目分析:因为今天小冰给我讲了一个与next数组配合的dp,也就 ...

  8. CodeForces - 126B Password(KMP中next数组)

    题目链接:点击查看 题目大意:给出一个字符串s,要求在字符串中找出一个子字符串t,要求t在s中出现了至少三次,一次在前缀,一次在后缀,一次在中间 注意一下,这里的前缀不能包括最后一个字母,后缀不能包括 ...

  9. KMP的next[]数组

    KMP是众多字符串问题的基础 理解next数组尤为重要 next又称前缀数组 是 它所处位置的前一个位置的元素 与 该链 链首开始 几个元素相匹配(即相同) 举个实例来说明: next对应的是该位置的 ...

最新文章

  1. 一个基于 Spring Boot 的项目骨架,少造轮子!
  2. 【渝粤题库】陕西师范大学164212 国际贸易实务 作业(专升本)
  3. hive的row_number()、rank()和dense_rank()的区别以及具体使用
  4. python用一行代码计算1~100的和(用reduce()和sum()内置函数实现)
  5. Oracle 进程 说明
  6. java和python哪个运行速度快_为什么Python代码的运行速度比较慢呢?这会影响Python语言的扩张吗?...
  7. 电脑C盘软件搬家,一键解决C盘不够用问题!
  8. 机器学习第九章聚类Kmeans练习(西瓜数据集4.0)
  9. ant design vue 修改 table 的默认分页的pageSize
  10. 保险H5页面、新增模板设计记录
  11. 李开复给中国学生的4封信
  12. python开源IP代理池--IPProxys
  13. [Maven实战-许晓斌]-[第二章]-2.3安装目录分析
  14. IntelliJ IDEA中项目的包和目录结构显示设置
  15. 弘扬企业家精神!闪马智能创始人兼CEO彭垚再获殊荣
  16. mysql 按时间累计计算_mysql查询——计算占比与累计占比
  17. Dom对象和java
  18. [转载]无欲则刚?_huadingjin_新浪博客
  19. 2017二本各大学计算机分数线,2017年二本院校排名及分数线
  20. 智能CAN总线隔离中继器集线器CANBridge-300/400

热门文章

  1. MySQL模糊查询—is null关键字
  2. 初步认识Volatile-什么叫缓存一致性呢?
  3. 手写自己的MyBatis框架-V2.0 可优化之处
  4. MyBatis 源码解读-获得Mapper 对象
  5. ViewResolvers
  6. RocketMQ消息支持的模式-消息异步发送
  7. springioc注解版运行效果演示
  8. Rocketmq原理最佳实践
  9. python字典有什么用_在Python中使用范围作为字典键,我有什么选...
  10. 腾讯微博发表带图片的微博