【HDU 2203】亲和串
题意
给你一个字符串s1,字符串s2,s1循环移位,使s2包含在s1中,则s2 是s1的亲和串
分析
把s1自身复制一遍接在后面。
方法一: 用strstr函数。
方法二: KMP算法。
方法三: 用C++的string的find函数。
代码
方法一:
#include<cstdio> #include<cstring> char s1[200009],s2[100009]; int len; int main() { while(~scanf("%s",&s1)) { len=strlen(s1); for(int i=0; i<len; i++) s1[len+i]=s1[i]; scanf("%s",&s2); if(strstr(s1,s2)-s1>=0) printf("yes\n"); else printf("no\n"); memset(s1,0,sizeof(s1)); memset(s2,0,sizeof(s2)); } return 0; }
方法二:
#include<cstdio> #include<cstring> char S[200005],T[100005]; int next[100005],len; void getNext(){ int i,k=-1; next[0]=k; for(i=1;T[i];i++){ while(k>=0 && T[i]!=T[k+1]) k=next[k]; if (T[i]==T[k+1]) k++; next[i]=k; } } int KMP(){ int i=0,j=0; while(i==-1||S[j]&&T[i]){ if(i==-1||S[j]==T[i]){ i++; j++; }else i=next[i]; } if(!T[i]) return j-i+1; return -1; } int main() { while(~scanf("%s",S)) { len=strlen(S); for(int i=len;i<2*len;i++) S[i]=S[i-len]; scanf("%s",T); getNext(); if(KMP()<0) printf("no\n"); else printf("yes\n"); memset(S,0,sizeof(S)); memset(T,0,sizeof(T)); } return 0; }
方法三
#include<iostream> using namespace std; int main() { string P,T; while(cin>>P>>T) { P+=P; if(P.find(T)!=string::npos)cout<<"yes"<<endl; else cout<<"no"<<endl; } return 0; }
┆凉┆暖┆降┆等┆幸┆我┆我┆里┆将┆ ┆可┆有┆谦┆戮┆那┆ ┆大┆始┆ ┆然┆
┆薄┆一┆临┆你┆的┆还┆没┆ ┆来┆ ┆是┆来┆逊┆没┆些┆ ┆雁┆终┆ ┆而┆
┆ ┆暖┆ ┆如┆地┆站┆有┆ ┆也┆ ┆我┆ ┆的┆有┆精┆ ┆也┆没┆ ┆你┆
┆ ┆这┆ ┆试┆方┆在┆逃┆ ┆会┆ ┆在┆ ┆清┆来┆准┆ ┆没┆有┆ ┆没┆
┆ ┆生┆ ┆探┆ ┆最┆避┆ ┆在┆ ┆这┆ ┆晨┆ ┆的┆ ┆有┆来┆ ┆有┆
┆ ┆之┆ ┆般┆ ┆不┆ ┆ ┆这┆ ┆里┆ ┆没┆ ┆杀┆ ┆来┆ ┆ ┆来┆