zoukankan      html  css  js  c++  java
  • 亲和串(两种方法妙解)

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

    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

    题解:

    这个循环位移不能理解成 AABCD 变成 ABCDA 、BCDAA、这样首部移到尾部。
    而是首尾相接了。。。即AABCD循环位移是AABCDAABCDAABCD···这样一直读下去。
    
    如果是第一种理解,只要是S2的长度大于S1的长度就应该是NO! 即S1="ABX" S2="ABXA"时应输出NO。
    
    但这题,在这种情况下是输出YES的,即取第二种理解。
    用kmp还不能用strcat,用了就超时
    代码-:
     1 #include<stdio.h>
     2 #include<string.h>
     3 const int MAXN=100010;
     4 char s1[MAXN],s2[MAXN];
     5 int next[MAXN],    len1,len2;
     6 void findnext(){
     7     int i=0,j=-1;
     8     next[0]=-1;
     9     while(s2[i]){
    10         if(j==-1||s2[i]==s2[j]){
    11             i++;j++;
    12             next[i]=j;
    13         }
    14         else j=next[j];
    15     }
    16 }
    17 bool kmp(){
    18     findnext();
    19     int i=0,j=0;
    20     while(i<len1+len2){
    21         if(j==-1||s1[i%len1]==s2[j]){
    22             i++;j++;
    23             if(!s2[j])return true;
    24         }
    25         else j=next[j];
    26     }
    27     return false;
    28 }
    29 int main(){
    30     while(~scanf("%s%s",s1,s2)){memset(next,0,sizeof(next));
    31     len1=strlen(s1);len2=strlen(s2);
    32     //for(int i=0;i<len2;i++)printf("%d ",next[i]);
    33     //printf("%s %s
    ",s1,s2);
    34     if(kmp())puts("yes");
    35     else puts("no");
    36     }
    37     return 0;
    38 }

    还可以用strstr函数:

     1 #include<stdio.h>
     2 #include<string.h>
     3 const int MAXN=100010;
     4 char s[MAXN*2],s1[MAXN],s2[MAXN];
     5 int main(){
     6     while(scanf("%s%s",s1,s2)==2){
     7         strcpy(s,s1);
     8         strcat(s,s1);
     9         if(strstr(s,s2)!=NULL)puts("yes");
    10         else puts("no");
    11     }
    12     return 0;
    13 }
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    using namespace  std;
    typedef long long LL;
    #define mem(x,y) memset(x,y,sizeof(x))
    #define SI(x) scanf("%d",&x)
    #define PI(x) printf("%d",x)
    #define P_ printf(" ")
    const int INF=0x3f3f3f3f;
    const int MAXN=100010;
    char s[MAXN];
    char ss[MAXN]; 
    int p[MAXN];
    int N;
    void getp(){
        int i=0,j=-1;
        p[0]=-1;
        while(ss[i]){
            if(j==-1||ss[i]==ss[j]){
                i++;j++;
                p[i]=j;
            }
            else j=p[j];
        }
    }
    
    void kmp(int& ans){
        getp();
        int j=0,i=0;
        int len=strlen(ss);
        int l=strlen(s);
        while(i<l+len){
            if(j==-1||ss[j]==s[i%l]){
                i++;j++;
                if(j==len){
                    ans++;return;
                }
            }
            else j=p[j];
        }
    }
    
    int main(){
        while(~scanf("%s%s",s,ss)){
            //strcat(s,s);
        //    scanf("%s",ss);
            int ans=0;
            kmp(ans);
            if(ans)puts("yes");
            else puts("no");
        }
        return 0;
    }
  • 相关阅读:
    Warning:detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd".
    Ubuntu16.04安装K8s步骤和踩坑记录【不错】
    修改主机名(/etc/hostname和/etc/hosts区别)
    Windows10内置Linux子系统初体验
    Docker Swarm常用命令
    Docker Swarm集群部署
    Docker容器CPU、memory资源限制
    Docker监控容器资源的占用情况
    修改Docker容器启动配置参数
    sort-colors——排序3种数字
  • 原文地址:https://www.cnblogs.com/handsomecui/p/4711962.html
Copyright © 2011-2022 走看看