题目的大意就是字符串1通过移位是否可以变为字符串2
让字符串1变为2倍形成一个环
kmp:
#include<algorithm>
#include<iostream>
#include<string.h>
#include<string>
#include<stdio.h>
using namespace std;
void Getnext(char *p,int next[])
{
int j=0;
int k=-1;
int pLen=strlen(p);
next[0]=-1;
while(j<pLen)
{
if(p[j]==p[k]||k==-1)
{
++j;
++k;
if(p[j]!=p[k])
next[j]=k;
else
next[j]=next[k];
}
else
k=next[k];
}
}
int KMPSearch(char *s,char *p,int next[])
{
int i=0;
int j=0;
int sLen=strlen(s);
int pLen=strlen(p);
int flag=0;
while(j<pLen&&i<sLen)
{
if(s[i]==p[j]||j==-1)
{
i++;
j++;
}
else
j=next[j];
if(i==sLen&&flag==0)
{
i=0;
flag=1;
}
}
if(j==pLen)
return 1;
else
return 0;
}
int main()
{
char a[100003];
char b[100003];
char c[200006];
while(~scanf("%s%s",a,b))
{
strcpy(c,a);
strcat(c,a);
int next[100003];
Getnext(b,next);
if(KMPSearch(c,b,next))
printf("yes\n");
else
printf("no\n");
}
}
strstr:
#include<algorithm>
#include<iostream>
#include<string.h>
#include<string>
#include<stdio.h>
using namespace std;
int main()
{
char a[100003];
char b[100003];
char c[200006];
while(~scanf("%s%s",a,b))
{
strcpy(c,a);
strcat(c,a);
if(strstr(c,b))
printf("yes\n");
else
printf("no\n");
}
}