题目:Cycle

链接:http://acm.hdu.edu.cn/showproblem.php?pid=5782

题意:给出两个字符串,判断两个字符串的每一个前缀是否循环相等(比如abc 和 cab相等),是输出一个1,否输出一个0,最后回车。

思路:

  kmp

  令s1为第一个字符串,s2为第二个字符串,先假设s1不可以循环,即s1的abc 不能变为cab,而s2可以。

  s1不可以循环,我们可以算出s1的next数组,然后用kmp匹配两个字符串是否循环相等,假设现在正在匹配 s1=abba 和 s2=baab,i 指针指在s1,j 指针指在s2,如果s1[i]和s2[j]不等,i = next[j],这些和普通的kmp一样(s2当做原串,s1当做模式串),不同的是等j 指向了s2的末尾,也就是说确认了s1的前缀ab 和 s2的后缀ab相等,那么j 变为0,再判断s2[j] 是否和 s1[i]相等,如果一直相等直到s1[i]=0,那么说明两个字符串循环相等,如果中间跳出,则可以判断两个字符串不循环相等。

  如果按照上面的方法进行,n*n的时间判断完,有可能会超时,但我们可以发现一个缩短时间的地方。

  比如:abbaa 和 baaba,我们在上一次计算已经算出s1的前缀ab 和上次s2的后缀ab 相等,其他前面的情况也判断过了,那么我们就不需要再重新判断这些了,i 指针可以直接从baa的b开始,j 指针可以直接从最后一个字符开始,同样判断到i 指针指向s1的结束符结束,这样可以缩短大量的时间,碰上aa...a 和 aa...a,就只要遍历一遍就ok了。

  上面的判断过程基于s1不循环,如果碰上bbab 和 babb 就不行了,那么我们再定义s2不循环,s1可以循环,再判断一遍,最后将两个成果或运算即可(即满足一种就可以)。

AC代码:

 #include<stdio.h>
#include<string.h>
int next[];
char s[];
char st[];
void get_next(char *s)
{
next[]=-;
next[]=;
int i=,j=;
while(s[i])
{
if(s[i]==s[j]) next[++i]=++j;
else if(next[j]!=-) j=next[j];
else next[++i]=;
}
} int kmp(int len,int &duan,char *s,char *st)
{
int ret=;
int i=len,j=duan;
while(i<=len)
{
if(st[i]==s[j])
{
i++;
j++;
}
else if(next[j]!=-) j=next[j];
else i++;
}
duan=j;
for(i=;j<=len;i++,j++)
{
if(st[i]!=s[j]) break;
}
if(j>len) return ;
return ;
}
int ans[];
int main()
{
while(scanf("%s%s",s,st)!=EOF)
{
int duan=;
get_next(s);
for(int i=;s[i];i++)
{
ans[i]=kmp(i,duan,s,st);
}
duan=;
get_next(st);
for(int i=;s[i];i++)
{
ans[i]|=kmp(i,duan,st,s);
}
for(int i=;s[i];i++)
printf("%d",ans[i]);
printf("\n");
}
return ;
}

  

HDU 5782 Cycle —— KMP的更多相关文章

  1. HDU 5782 Cycle(KMP+Hash)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5782 [题目大意] 给出两个字符串,判断他们每一个前缀是否循环同构,循环同构的意思就是,字符串首位 ...

  2. HDU 5782 Cycle(KMP+哈希)

    http://acm.split.hdu.edu.cn/showproblem.php?pid=5782 题意:给出两个长度相等的字符串,输出两个字符的每个前缀是否循环相同. 思路: 如果连个串循环相 ...

  3. hdu 5782(kmp+hash)

    Cycle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...

  4. HDU 2087  KMP模板题

    1.HDU 2087 2.题意:一个主串,一个子串,求子串在主串里出现了几次. 3.总结:看了题解,还是不太懂.. //#include<iostream>#include<cmat ...

  5. Number Sequence HDU 1711(KMP)

    http://acm.hdu.edu.cn/showproblem.php?pid=1711 首次接触KMP,自己都不是特别理解.在网上百度看了好几个帖子之后,对KMP也有了初步的理解. #inclu ...

  6. hdu 1686 Oulipo KMP匹配次数统计

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1686 分析:典型的KMP算法,统计字符串匹配的次数. 用Next数组压缩时间复杂度,要做一些修改. / ...

  7. HDU 4763 (KMP算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4763 题目大意:给定一串字符,从中找出符合“EAEBE”格式的E的最大字符数.AB可以是任意数量的任意 ...

  8. hdu 5510 Bazinga KMP+尺取法

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5510 题意:至多50组数据,每组数据至多500个字符串,每个字符串的长度最长为2000.问最大的下标( ...

  9. HDU 1358 Period KMP

    题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=1358 求周期问题,简单KMP—— AC代码: #include <iostream> # ...

随机推荐

  1. docker1.13.1的安装与卸载及mysql5.5安装实例

    docker中国官方地址:https://www.docker-cn.com/ 您可以使用以下命令直接从该镜像加速地址进行拉取: $ docker pull registry.docker-cn.co ...

  2. ElasticSearch(一):CentOS7 安装 ElasticSearch6.4.0

    一.安装jre支持 在CentOS中安装ElasticSearch需要Java1.8.0,可执行命令#  java -version查看当前系统所安装Java版本是否为1.8.0版本. 若非1.8.0 ...

  3. 使用c#封装海康SDK出现无法加载 DLL“..\bin\HCNetSDK.dll”: 找不到指定的模块

    最近在研究网络摄像头的二次开发,测试了一款海康威视的网络摄像头,程序调试的时候,出现如题的报错. 调试随机自带的demo时,程序运行正常,但当把该程序引入到我自己的程序中时,就开始报错.根据开发软件包 ...

  4. 单片机与android手机通信(控制LED小灯亮灭)

    1.单片机实验板功能设计 为验证数据通信内容,让单片机板上的四个按键与android手机客户端上的四个LED灯相互控制:为达到上述基本实验要求,采用单字符传输数据即可,硬件需设计两块相同的单片机电路板 ...

  5. 自然语言处理之LDA主题模型

    1.LDA概述 在机器学习领域,LDA是两个常用模型的简称:线性判别分析(Linear Discriminant Analysis)和 隐含狄利克雷分布(Latent Dirichlet Alloca ...

  6. Python:Day17 生成器、time和random模块

    列表生成式: a = [x*2 for x in range(10)] #这是最简单的列表生成式,range换成其它的序列也OK a = [f(x) for x in range(10)] #将里将前 ...

  7. 吴恩达课后作业学习1-week2-homework-logistic

    参考:https://blog.csdn.net/u013733326/article/details/79639509 希望大家直接到上面的网址去查看代码,下面是本人的笔记 搭建一个能够 “识别猫” ...

  8. RMQ问题--范围最小值问题

    范围最小值问题(Range Minium Query,RMQ)---RMQ问题 一.一维问题 给出一个n个元素的数组A1,A2,...,An, 设计一个数据结构, 支持查询操作Query(L,R):计 ...

  9. maven的下载,环境变量配置,和eclipse配置,和IntelliJIDEA配置

    一.maven简介 Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖 ...

  10. Bing.com在.NET Core 2.1上运行!

    Bing.com在.NET Core 2.1上运行! 相关知识请参考.netCore开发团队博客(https://blogs.msdn.microsoft.com/dotnet/) Bing.com是 ...