杭電ACM HDU 2203 親和串

來源:互聯網
上載者:User
親和串

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


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 


  Author Eddy


  Recommend lcy

  KMP,直接搜尋也可過

 

#include <cstdio>#include <cstring>#define MAX 100010void getnext(char s[],int next[]){    int i,j,length;    next[0]=-1;    i=0;    j=-1;    length=strlen(s);    while(i<length){        if(j==-1||s[i]==s[j]){            i++;j++;next[i]=j;        }        else j=next[j];    }}int kmp(char t[],char p[],int next[]){    int i=0,j=0;    int len1=strlen(t),len2=strlen(p);    while(i<len1&&j<len2){        if(j==-1||t[i]==p[j])            i++,j++;        else j=next[j];    }    if(j==len2) return i-len2;    else return -1;}int main(){    char s1[MAX*2],s2[MAX];    int l1,l2,next[MAX];    while(~scanf("%s",s1)){        scanf("%s",s2);        l1=strlen(s1);        for(int i=0;i<l1;i++)            s1[i+l1]=s1[i];        s1[l1*2]=0;        getnext(s2,next);        printf("%s\n",kmp(s1,s2,next)==-1?"no":"yes");    }}


 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.