327 亲和串【kmp】
2015-08-28 00:09
288 查看
亲和串
时间限制:1000 ms | 内存限制:65535 KB难度:3
描述最近zyc遇到了一个很棘手的问题:判断亲和串,以前判断亲和串的时候直接可以看出来,但现在不同了,现在给出的两字符串都非常的大,看的zyc头都晕了。于是zyc希望大家能帮他想一个办法来快速判断亲和串。亲和串定义:给定两个字符串s1和s2,如果能通过s1循环移动,使s2包含在s1中,那么我们就说s2是s1的亲和串。
输入本题有多组测试数据,每组数据的第一行包含输入字符串s1,第二行包含输入字符串s2,s1与s2的长度均小于100000。
输出如果s2是s1的亲和串,则输出"yes",反之,输出"no"。每组测试的输出占一行。
样例输入
AABCD CDAA ASD ASDF
样例输出
yes no
刚看到这个题的时候就明白需要用到kmp,不过这个题有一些处理技巧,就是这个给出的字符串可以是首尾相连的,可以移动来匹配...
为了处理这个问题,可以把主串多遍历一部分(最多一遍),然后在匹配的时候进行取余运算,相当于进行了循环...这样的思路很简便的就解决了循环的问题,而且不必要担心匹配的问题,因为对长度取余相当于把这个串首尾连接起来了.........
下面就是kmp的调用了....
#include<stdio.h> #include<string.h> #define maxn 100005 int next[maxn],lenx,leny; char x[maxn],y[maxn]; void get_next()//先找next数组 { int i=0,j=-1; next[0]=-1; while(i<lenx) { if(j==-1||x[i]==x[j]) { ++i;++j; next[i]=j; } else { j=next[j]; } } } void kmp() { get_next(); int i=0,j=0; while(i<2*leny)//二倍之内就可以匹配所有情况 { if(j==-1||x[j]==y[i%leny])//取余就处理了循环的情况 { ++i;++j; if(j==lenx)//查找到的时候 { printf("yes\n"); return; } } else { j=next[j]; } } printf("no\n");//否则 } int main() { while(gets(y)) { gets(x); lenx=strlen(x); leny=strlen(y); kmp(); } return 0; }
相关文章推荐
- 移动手机组态软件UI设计思路探讨
- TextView字体颜色选择器
- 真实的数据可视化应该是这样的
- Android Download机制详解(一)DocumentUI部分
- 数据库startup启动不起来了。报错ORA-01172
- 数据库startup启动不起来了。报错ORA-01172
- 稳定婚姻问题专题小结(二分图匹配 稳定婚姻问题--延迟拒绝算法(Gale-Shapley 算法))
- linux进入单用户模式修改管理员密码
- 开源免费的C/C++网络库(c/c++ sockets library)
- 万能适配器MyBaseAdapter
- HDU 1533--Going Home【最小费用最大流 && 模板】
- HDU 2955 Robberies(01 背包)
- Hadoop(三)——核心之一HDFS
- 【剑指offer】十,反转链表
- win10下环境变量设置
- Loi 2015.8.27 TEST 坑题互测
- 优化算法——截断梯度法(TG)
- SVN基本指令
- 网站搭建过程中后台相关 随笔
- 网站搭建过程中后台相关 随笔