HDU 2203亲和串
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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; }
以上是关于HDU 2203亲和串的主要内容,如果未能解决你的问题,请参考以下文章