zoukankan      html  css  js  c++  java
  • HDU 2203 亲和串

    题目:

    人随着岁数的增长是越大越聪明还是越大越笨,这是一个值得全世界科学家思考的问题,同样的问题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
    题意描述:
    输入两个字符串s1和s2
    判断能否通过循环移动1使得s2包含在s1中,能输出“yes”否则输出“no”。
    解题思路:
    首先是一个这是一个字符串匹配问题,其次说是能否通过循环移动使得s2包含在s1中,如果真的一位一位循环移动的话,可能超时不说,确实有些麻烦,那么我们可以讲两个s1串接在一起,这样其实也就是循环移动的最终
    结果,最后将s2在两个s1的串中只用KMP进行匹配就好了。
    代码实现:
     1 #include<stdio.h>
     2 #include<string.h>
     3 char S[200020],T[100010];
     4 int kmp(char *S, char *T);
     5 int get_next(char *T,int *next);
     6 int main()
     7 {
     8     int l1,l2;
     9     char c[100010];
    10     while(scanf("%s%s",S,T) != EOF)
    11     {
    12         l1=strlen(S);
    13         l2=strlen(T);
    14         if(l1 < l2)
    15         {
    16             printf("no
    ");
    17             continue;
    18         }
    19         else
    20         {
    21             strcpy(c,S);
    22             strcat(S,c);
    23             kmp(S,T);    
    24         }
    25     }
    26     return 0;
    27 }
    28 int get_next(char *T,int *next)
    29 {
    30     int i=0,j=-1,l2;
    31     l2=strlen(T);
    32     next[0]=-1;
    33     while( i < l2 )
    34     {
    35         if(j == -1 || T[i] == T[j])
    36         {
    37             ++i;
    38             ++j;
    39             next[i]=j;
    40         }
    41         else 
    42             j=next[j];
    43     }
    44     /*for(i=0;i<l2;i++)
    45         printf("%d ",next[i]);
    46     printf("
    ");*/
    47 }
    48 int kmp(char *S, char *T)
    49 {
    50     int i=0,j=0,l1,l2;
    51     l1=strlen(S);
    52     l2=strlen(T);
    53     int next[100010];
    54     get_next(T,next);
    55     while(i < l1 && j < l2)
    56     {
    57         if(j==-1 || S[i] == T[j]) 
    58         {
    59             ++i;
    60             ++j;
    61         }
    62         else 
    63             j=next[j];
    64     }
    65     //printf("%d
    ",j);
    66     if(j >= l2)
    67     printf("yes
    ");
    68     else
    69     printf("no
    ");
    70 }
  • 相关阅读:
    @resource、@Autowired、@Service在一个接口多个实现类中的应用
    java 中 静态块的作用
    数组、List和ArrayList的区别
    C#优化
    Net XML操作
    Asp.Net MVC+EF+三层架构的完整搭建过程
    C#多线程
    算法
    详解java中的byte类型
    虚幻4蓝图编译剖析(三)
  • 原文地址:https://www.cnblogs.com/wenzhixin/p/7344076.html
Copyright © 2011-2022 走看看