hdu 亲和串(kmp)

Problem Description

人随着岁数的增长是越大越聪明还是越大越笨,这是一个值得全世界科学家思考的问题,同样的问题Eddy也一直在思考,因为他在很小的时候就知道亲和串如何判断了,但是发现,现在长大了却不知道怎么去判断亲和串了,于是他只好又再一次来请教聪明且乐于助人的你来解决这个问题。
亲和串的定义是这样的:给定两个字符串s1和s2,如果能通过s1循环移位,使s2包含在s1中,那么我们就说s2 是s1的亲和串。

Input

本题有多组测试数据,每组数据的第一行包含输入字符串s1,第二行包含输入字符串s2,s1与s2的长度均小于100000。

Output

如果s2是s1的亲和串,则输出"yes",反之,输出"no"。每组测试的输出占一行。

Sample Input

AABCD

CDAA

ASD

ASDF

Sample Output

yes
no

Author

Eddy

Recommend

lcy   |   We have carefully selected several similar problems for you:  1358 3336 3746 2205 2207

题解:注意循环...

代码:

 1 #include <vector>
 2 #include <map>
 3 #include <set>
 4 #include <algorithm>
 5 #include <iostream>
 6 #include <cstdio>
 7 #include <cmath>
 8 #include <cstdlib>
 9 #include <string>
10 #include <cstring>
11 #include <queue>
12 using namespace std;
13 #define INF 0x3f3f3f3f
14
15 char p[100010],s[100010];
16 int nex[100010];
17 int lens;
18
19 void get(char *p)
20 {
21     int plen=strlen(p);
22     nex[0]=-1;
23     int k=-1,j=0;
24     while(j < plen){
25         if(k==-1 || p[j] == p[k]){
26             ++j;
27             ++k;
28             if(p[j] != p[k])
29                 nex[j]=k;
30             else
31                 nex[j]=nex[k];
32         }
33         else{
34             k=nex[k];
35         }
36     }
37 }
38
39 int kmp(int lens,char *p)
40 {
41     int i=0,j=0;
42     int slen=lens;
43     int plen=strlen(p);
44     while(i < slen && j< plen){
45         if(j==-1 || s[i]==p[j]){
46             ++i;
47             ++j;
48         }
49         else{
50             j=nex[j];
51         }
52     }
53     if(j == plen)
54         return i-j;
55     else
56         return -1;
57 }
58
59 int main()
60 {
61     while(~scanf("%s%s",s,p)){
62         lens=strlen(s);
63         for(int i=lens; i<2*lens; i++){
64             s[i]=s[i-lens];
65         }
66         get(p);
67         lens+=lens;
68         if(kmp(lens,p)!=-1)
69             puts("yes");
70         else
71             puts("no");
72     }
73 }
时间: 2024-11-04 17:29:19

hdu 亲和串(kmp)的相关文章

hdu 2203 亲和串 kmp

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2203 思路: Problem Description 人随着岁数的增长是越大越聪明还是越大越笨,这是一个值得全世界科学家思考的问题,同样的问题Eddy也一直在思考,因为他在很小的时候就知道亲和串如何判断了,但是发现,现在长大了却不知道怎么去判断亲和串了,于是他只好又再一次来请教聪明且乐于助人的你来解决这个问题.亲和串的定义是这样的:给定两个字符串s1和s2,如果能通过s1循环移位,使s2包含在s1中

HDU 2203 亲和串 (KMP或者strstr)

亲和串 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 8756    Accepted Submission(s): 3976 Problem Description 人随着岁数的增长是越大越聪明还是越大越笨,这是一个值得全世界科学家思考的问题,同样的问题Eddy也一直在思考,因为他在很小的时候就知道亲和串如何判断了,但是发现,现在长

hdu 2203 亲和串 KMP入门

亲和串 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 9065    Accepted Submission(s): 4135 Problem Description 人随着岁数的增长是越大越聪明还是越大越笨,这是一个值得全世界科学家思考的问题,同样的问题Eddy也一直在思考,因为他在很小的时候就知道亲和串如何判断了,但是发现,现在长

亲和串 (hdu 2203 KMP)

亲和串 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 8049    Accepted Submission(s): 3719 Problem Description 人随着岁数的增长是越大越聪明还是越大越笨,这是一个值得全世界科学家思考的问题,同样的问题Eddy也一直在思考,因为他在很小的时候就知道亲和串如何判断了,但是发现,现在长

HDU 2203 亲和串(kmp)

Problem Description 人随着岁数的增长是越大越聪明还是越大越笨,这是一个值得全世界科学家思考的问题,同样的问题Eddy也一直在思考,因为他在很小的时候就知道亲和串如何判断了,但是发现,现在长大了却不知道怎么去判断亲和串了,于是他只好又再一次来请教聪明且乐于助人的你来解决这个问题. 亲和串的定义是这样的:给定两个字符串s1和s2,如果能通过s1循环移位,使s2包含在s1中,那么我们就说s2 是s1的亲和串. Input 本题有多组测试数据,每组数据的第一行包含输入字符串s1,第二

(KMP 1.6)hdu 2203 亲和串(判断文本串循环移位之后是否能将模式串包含在其中)

题目: 亲和串 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 9139    Accepted Submission(s): 4174 Problem Description 人随着岁数的增长是越大越聪明还是越大越笨,这是一个值得全世界科学家思考的问题,同样的问题Eddy也一直在思考,因为他在很小的时候就知道亲和串如何判断了,但是发现,

HDU 2203 亲和串

题解:将原来的串扩展为两倍,然后用KMP匹配. #include <cstdio> #include <cstring> char str[200005],pat[100005]; int next[100005],N,M; void getnext(){ int i=1,j=0;next[1]=0; while(i<M){ if(j==0||pat[i]==pat[j])next[++i]=++j; else j=next[j]; } } int KMP(){ int i=

HDU2203 亲和串【KMP】

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2203 题目大意: 给定亲和串的定义:给定两个字符串s1和s2,如果能通过s1循环移位,使s2包含在s1中, 那么我们就说s2 是s1的亲和串.现在给你两个字符串s1和s2,判断s2是否是s1的亲和串. 思路: 先判断s2的串长度是否小于等于s1的长度,因为如果s2的串长度比s1还要长的话,s2是不 可能是s1的亲和串.然后在s1的串后边在街上s1的串,对s1和s2进行KMP算法,看s1的串 中是否

【HDU 2203】亲和串

题 题意 给你一个字符串s1,字符串s2,s1循环移位,使s2包含在s1中,则s2 是s1的亲和串 分析 把s1自身复制一遍接在后面. 方法一: 用strstr函数. 方法二: KMP算法. 方法三: 用C++的string的find函数. 代码 方法一: #include<cstdio> #include<cstring> char s1[200009],s2[100009]; int len; int main() { while(~scanf("%s",&