• hdu 2203 亲和串


    亲和串

    Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 3732    Accepted Submission(s): 1670


    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

    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    using namespace std;
    char str1[100000],str2[100000];
    char str[200000];
    int main()
    {
        while(scanf("%s",str1)!=EOF)
        {
            scanf("%s",str2);
            strcpy(str,str1);
            strcat(str,str1);
            if(strstr(str,str2)!=NULL)
             printf("yes\n");
            else
             printf("no\n");
        }
        return 0;
    }

    //KMP,测试了下、是0Ms,不理解上面的代码为啥也是0Ms,叫我写了半个多小时的KMP怎么办
    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    using namespace std;
    char str1[100000],str2[100000];
    char str[200000];
    int next[100000];
    void KMP()
    {
       int i,j;
       next[0]=-1;
       i=1,j=0;
       while(str2[i]!='\0')
       { // printf("%d",i);
           if(str2[i]==str2[j])
           {
               next[++i]=++j;
               if(str2[i]==str[j])
                  next[i]=next[j];
           }
           else
           {
               j=next[j];
               if(j==-1)
                {
                    i++;
                    next[i]=0;
                    j=0;
                }
           }
       }
    }
    int main()
    {    int i,j;
         bool b;
        while(scanf("%s",str1)!=EOF)
        {
            scanf("%s",str2);
            strcpy(str,str1);
            strcat(str,str1);
            KMP();
         //   for(int i=0;i<=10;i++)
          //    printf("%d ",next[i]);
          i=j=b=0;
           while(str[i]!='\0')
             if(str[i]==str2[j])
             {
                 i++;
                 j++;
                 if(str2[j]=='\0')
                   {b=1;break;}
             }
             else
             {
                 j=next[j];
                 if(j==-1)
                 {
                     i++;
                     j=0;
                 }
             }
             if(b) printf("yes\n"); else printf("no\n");

        }
        return 0;
    }


  • 相关阅读:
    python学习的第六天数据类型及内置方法part2
    作业5
    Python学习第五天基本数据类型及内部方法part1
    周作业
    作业
    python学习第四天控制流程if、while、for
    作业
    python学习第三天基本数据类型、格式化输入输出、运算符。流程控制
    从排序数组中删除重复项
    D3.js 比例尺
  • 原文地址:https://www.cnblogs.com/372465774y/p/2604370.html
Copyright © 2020-2023  润新知