HDU2203_亲和串

亲和串

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


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
 

解题报告
这题是我在没学KMP算法是写的,当作练习朴素算法,TLE的那种。。。
#include<stdio.h>
#include<string.h>
int main()
{
    char T[100005],B[100005];
    int i,j,f,l;
    while(scanf("%s%s",T,B)!=EOF)
    {
        f=0;
        char S[100005];
        strcpy(S,T);
        strcat(S,T);
        for(i=0; i<strlen(S)-strlen(B)+1; i++)//朴素算法
        {
            for(j=0; j<strlen(B); j++)
            {
                if(S[i+j]!=B[j])
                    break;
            }
            if(j==strlen(B))
                f=1;
        }
        if(f)printf("yes\n");
        else printf("no\n");
    }
}


很逗的是我改下代码,就AC了。。。
学长说把strlen函数写进循环体中,每次循环都要调用。。。
#include<stdio.h>
#include<string.h>
int main()
{
    char T[100005],B[100005];
    int i,j,f,l,l1,l2;
    while(scanf("%s%s",T,B)!=EOF)
    {
        f=0;
        char S[100005];
        strcpy(S,T);
        strcat(S,T);
        l1=strlen(S);
        l2=strlen(B);
        for(i=0; i<l1-l2+1; i++)//朴素算法
        {
            for(j=0; j<l2; j++)
            {
                if(S[i+j]!=B[j])
                    break;
            }
            if(j==l2)
                f=1;
        }
        if(f)printf("yes\n");
        else printf("no\n");
    }
}

这题用strstr写也可以。。。
#include<stdio.h>
    #include<string.h>
    int main()
    {
        char T[100005],B[100005];
        int i,j,f,l;
        while(scanf("%s%s",T,B)!=EOF)
        {
            f=0;
            char S[100005];
            strcpy(S,T);
            strcat(S,T);
            //puts(S);
            /*for(i=0;i<strlen(S)-strlen(B)+1;i++)
            {
                for(j=0;j<strlen(B);j++)
                {
                    if(S[i+j]!=B[j])
                        break;
                }
                if(j==strlen(B))
                    f=1;
            }
            if(f)printf("yes\n");
            else printf("no\n");*/
            if(strstr(S,B))
            printf("yes\n");
            else
            printf("no\n");
        }
    }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值