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的串

中是否包含s2的串,如果包含,则s2就是s1的亲和串,否则就不是亲和串。

AC代码:

# include<stdio.h>
# include<string.h>

char a[200010],b[100010];
int next[100010];
void getnext(char *pat)
{
    int len_pat = strlen(pat);
    int i = 0;
    int j = -1;
    next[0] = -1;
    while(i < len_pat)
    {
        if(j == -1 || pat[i] == pat[j])
        {
            i++;
            j++;
            next[i] = j;
        }
        else
            j = next[j];
    }

}

int KMP(char *str, char *pat)
{
    int i = 0;
    int j = 0;
    int len_str = strlen(str);
    int len_pat = strlen(pat);
    getnext(pat);
    while(i < len_str)
    {
        if(j == -1 || str[i] == pat[j])
        {
            i++;
            j++;
        }
        else
            j = next[j];

        if(j >= len_pat)
            return 1;
    }

    return 0;
}
int main()
{
    int len_a,len_b,i;
    while(~scanf("%s%s",a,b))
    {
        len_a = strlen(a);
        len_b = strlen(b);
        if(len_a < len_b)
        {
            printf("no\n");
            continue;
        }
        for(i = 0; i <len_a; i++)
            a[i+len_a] = a[i];
        a[i+len_a] = '\0';

        if(!KMP(a,b))
            printf("no\n");
        else
            printf("yes\n");

    }
    return 0;
}
时间: 2024-11-03 12:21:22

HDU2203 亲和串【KMP】的相关文章

hdu 2203 亲和串 kmp

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

HDU2203:亲和串

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

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或者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 亲和串(kmp)

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

亲和串 (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,第二

NYOJ327 亲和串 【KMP】

亲和串 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 最近zyc遇到了一个很棘手的问题:判断亲和串,以前判断亲和串的时候直接可以看出来,但现在不同了,现在给出的两字符串都非常的大,看的zyc头都晕了.于是zyc希望大家能帮他想一个办法来快速判断亲和串.亲和串定义:给定两个字符串s1和s2,如果能通过s1循环移动,使s2包含在s1中,那么我们就说s2是s1的亲和串. 输入 本题有多组测试数据,每组数据的第一行包含输入字符串s1,第二行包含输入字符串s2,s1与s2的

(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也一直在思考,因为他在很小的时候就知道亲和串如何判断了,但是发现,