#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define MAX 100007
using namespace std;
char s1[MAX<<1],s2[MAX];
void get_next ( char p[] , int next[] )
{
int len = strlen ( p );
int i = 0 , k = -1;
next[0] = -1;
while ( i != len )
{
if ( k == -1 || p[i] == p[k] )
i++,k++,next[i] = k;
else k = next[k];
}
}
bool match ( char s[] , char p[] )
{
int next[MAX];
get_next ( p , next );
int i = 0 , j = 0;
int len1 = strlen ( s );
int len2 = strlen ( p );
while ( i < len1 )
{
if ( j == -1 || s[i] == p[j] ) i++,j++;
else j = next[j];
if ( j == len2 ) return true;
}
return false;
}
int main ( )
{
while ( ~scanf ( "%s" , s1 ) )
{
scanf ( "%s" , s2 );
int len = strlen ( s1 );
for ( int i = len ; i < 2*len ; i++ )
s1[i] = s1[i-len];
s1[2*len] = 0;
if ( strlen(s1) < strlen(s2) || !match ( s1 , s2 ) )
puts ( "no" );
else puts ( "yes" );
}
}
hdu 2203 kmp 模板题
最新推荐文章于 2020-08-28 18:52:19 发布