您的位置:首页 > 其它

【HDU 2203】亲和串

2016-02-14 17:11 253 查看


题意

给你一个字符串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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: