亲和串

http://acm.hdu.edu.cn/showproblem.php?pid=2203


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

思想:由于题目的n相当的大,因此普通的穷举循环移位然后进行比对是否包含来判断亲和串的方式肯定会TLE。但是通过观察我们发现: 这里以s1=ABCD为例子,我们分析s1循环移位后的结果,如下所示:ABCD->BCDA->CDAB->DABC->ABCD....如果我们把前面移走的数据进行保留,那么我们会发现如下规律:ABCD->ABCDA->ABCDAB->ABCDABC->ABCDABCD,因此把s1的循环移位后的字符串可以看作是s1s1的子字符串,这样就构造了解,所以我们只要把s2与s1s1进行比较,在s1s1中是否存在s2这样的子串就可以了。

代码:

#include<iostream> #include<cstdio> #include<string.h> using namespace std; int main() { char s1[100010],s2[100010],s3[200020]; while(gets(s1)) { gets(s2); strcpy(s3,s1); strcat(s3,s1); if(strstr(s3,s2)!=NULL)查找s2在s3中第一次出现的位置返回第一次出现的位置指针,如果找不到则返回NULL。 cout<<"yes"<<endl; else cout<<"no"<<endl; } return 0; }

另一种代码:

#include<iostream> #include<string> #include<cstdio> using namespace std; int main() { string a,b,c; while(cin>>a>>b) { if(a.size()<b.size()) {cout<<"no"<<endl;continue;} a=a+a; if(a.find(b,0)!=string::npos) cout<<"yes"<<endl; else cout<<"no"<<endl; }return 0; }



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值