码迷,mamicode.com
首页 > 其他好文 > 详细

HDU2203 亲和串【KMP】

时间:2015-04-26 10:57:42      阅读:121      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:

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;
}


HDU2203 亲和串【KMP】

标签:

原文地址:http://blog.csdn.net/lianai911/article/details/45285871

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!