• 亲串 (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也一直在思考,由于他在非常小的时候就知道亲和串怎样推断了。可是发现,如今长大了却不知道怎么去推断亲和串了,于是他仅仅好又再一次来请教聪明且乐于助人的你来解决问题。
    亲和串的定义是这种:给定两个字符串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
     中文题,题意不多说,直接上代码:
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <string>
    #include <map>
    #include <stack>
    #include <vector>
    #include <set>
    #include <queue>
    #pragma comment (linker,"/STACK:102400000,102400000")
    #define maxn 100010
    #define MAXN 2005
    #define mod 1000000009
    #define INF 0x3f3f3f3f
    #define pi acos(-1.0)
    #define eps 1e-6
    typedef long long ll;
    using namespace std;
    
    char str[2*maxn],pstr[2*maxn];
    int nextval[2*maxn];
    
    void get_nextval()
    {
        int plen=strlen(pstr);
        int i=0,j=-1;
        nextval[0]=-1;
        while (i<plen)
        {
            if (j==-1||pstr[i]==pstr[j])
            {
                i++;
                j++;
                if (pstr[i]!=pstr[j])
                    nextval[i]=j;
                else
                    nextval[i]=nextval[j];
            }
            else
                j=nextval[j];
        }
    }
    
    bool KMP()
    {
        int i=0,j=0;
        int len=strlen(str);
        int plen=strlen(pstr);
        while (i<len&&j<plen)
        {
            if (j==-1||str[i]==pstr[j])
            {
                i++;
                j++;
            }
            else
                j=nextval[j];
        }
        if (j==plen)
            return true;
        return false;
    }
    
    int main()
    {
        while (~scanf("%s%s",str,pstr))
        {
            int len=strlen(str);
            for (int i=0;i<len;i++)
                str[len+i]=str[i];
            str[len+i]='';
            get_nextval();
            if (KMP())
                printf("yes
    ");
            else
                printf("no
    ");
        }
        return 0;
    }
    /*
    AABCD
    CDAA
    ASD
    ASDF
    */
    


    版权声明:本文博客原创文章。博客,未经同意,不得转载。

  • 相关阅读:
    二、策略模式之商场促销计价器
    一、简单工厂模式之简易计算器
    java学习基础知识十——反射
    java学习基础知识九——IO
    java学习基础知识八——泛型
    java学习基础知识七
    java学习基础知识六
    二、机器学习模型评估
    《将博客搬至CSDN》
    一、Hadoop课程
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4710998.html
Copyright © 2020-2023  润新知