题目: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. InfluxDB基本概念和操作

    InfluxDB基本概念 1.数据格式 在 InfluxDB 中,我们可以粗略的将要存入的一条数据看作一个虚拟的 key 和其对应的 value(field value).格式如下: 1 cpu_us ...

  2. Scrapy 框架 中间件 代理IP 提高效率

    中间件 拦截请求跟响应 进行ua(User-Agent ) 伪装 代理 IP 中间件位置: 引擎 和下载器 中间 的中间件 ( 下载中间件) 引擎 跟 spider 中间 的中间件 ( 爬虫中间件)( ...

  3. linux学习(杂项)

    内存使用情况 磁盘使用情况 负载情况 查看cpu 可视化磁盘 循环创建文件夹 删除文件夹 移动文件 gg行首 G行尾 dd删除一行 u恢复 yy复制一行 p粘贴一行 enter下翻 less 与 mo ...

  4. 6.01-re-split_chinese

    import re # 1.拆分字符串 one = 'asdsfsgsh' # 标准 是 s 为拆分 pattern = re.compile('s') result = pattern.split( ...

  5. NOsql总结

    NOsql总结 1.存储: 任意格式的数据:值对存储,列存储,文档存储,图形数据库 灵活的表结构支持:类型动态.scheme动态: 灵活的存储形式:列存储: 弱关系:NoSQL数据库种类繁多,但是一个 ...

  6. http: server gave HTTP response to HTTPS client & Get https://192.168.2.119/v2/: dial tcp 192.168.2.119:443: getsockopt: connection refused

    http: server gave HTTP response to HTTPS client 出现这问题的原因是:Docker自从1.3.X之后docker registry交互默认使用的是HTTP ...

  7. centos7下安装docker(13.4容器volume总结)

    最近我们学习了docker 存储,首先docker存储有两种:storage driver和data volume. storage driver是由镜像层和容器层组成的,可以通过docker ins ...

  8. 转://RMAN跨平台可传输表空间和数据库

    参考链接: http://blog.itpub.net/23135684/viewspace-776048/ http://blog.sina.com.cn/s/blog_69e7b8d7010164 ...

  9. The authenticity of host 'ip (ip)' can't be established.

    问题 The authenticity of host '10.4.172.67 (10.4.172.67)' can't be established.ECDSA key fingerprint i ...

  10. Spring Security(二十八):9.4 Authentication in a Web Application

    Now let’s explore the situation where you are using Spring Security in a web application (without we ...