hdu 2203:親和串(水題、串の練習)

7090 ワード

親和串
Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 7298    Accepted Submission(s): 3324
Problem Description
人は年を取るにつれて賢くなるか、それとも大きくなるにつれて愚かになるか、これは世界の科学者が考える価値のある問題であり、同じ問題Eddyもずっと考えていた.彼は小さい頃から親和串がどのように判断したか知っていたからだ.しかし、今大きくなっても親和串をどのように判断するか分からないことに気づいた.そこで彼はもう一度聡明で人を助けるのが好きなあなたにこの問題を解決するように教えてもらうしかなかった.
親和列の定義は、2つの文字列s 1およびs 2が与えられ、s 1サイクルシフトによってs 2をs 1に含めることができれば、s 2はs 1の親和列であるということである.
 
 
Input
この問題には複数のテストデータがあり、各データの第1行には入力文字列s 1が含まれ、第2行には入力文字列s 2が含まれ、s 1とs 2の長さはいずれも100000未満である.
 
 
Output
s 2がs 1の親和列である場合、「yes」が出力され、逆に「no」が出力される.各テストの出力は1行を占めます.
 
 
Sample Input
AABCD
CDAA
ASD
ASDF
 
 
Sample Output
yes
no
 
 
Author
Eddy
 
 
Recommend
lcy   |   We have carefully selected several similar problems for you:  
1686  
1711  
2201  
3746  
3068  
 
串の練習.
最初はKMPアルゴリズムでマッチングしようとしたが,ライブラリ関数を直接使えばこの問題を簡単に解決できることが分かった.
strcpy()、strcat()、strstrstr()の3つの関数をそれぞれ使いました.この問題は文字列処理関数を練習するのにいいです.
もちろんKMPアルゴリズムのやり方も実現しますが、今は時間がないので、後で話しましょう.
バージョン1(strstr()関数のみ):
 1 #include <iostream>

 2 #include <string.h>

 3 using namespace std;

 4 

 5 int main()

 6 {

 7     char s1[200000],s2[100000];

 8     while(cin>>s>>s2){

 9         int len1 = strlen(s1);

10         int i;

11         for(i=len1;i<2*len1;i++)    // s1         

12            s1[i] = s1[i-len1];

13         s1[i] = '\0';

14         if(strstr(s1,s2))   // s1     s2  

15             cout<<"yes"<<endl;

16         else

17             cout<<"no"<<endl;

18     }

19     return 0;

20 }

バージョン2(進化バージョン、3つの関数で使用):
 1 #include <iostream>

 2 #include <string.h>

 3 using namespace std;

 4 

 5 int main()

 6 {

 7     char s1[200000],s2[100000],s[100000];

 8     while(cin>>s>>s2){

 9         strcpy(s1,s);

10         strcat(s1,s);

11         if(strstr(s1,s2))   // s1     s2  

12             cout<<"yes"<<endl;

13         else

14             cout<<"no"<<endl;

15     }

16     return 0;

17 }

 
 
Freecode :  www.cnblogs.com/yym2013