1 /* 2 * kmp 3 */ 4 5 #include <cstdio> 6 #include <cstring> 7 #include <iostream> 8 9 using namespace std; 10 11 const int N = 100005; 12 13 char str[N<<1]; 14 char pat[N]; 15 int next[N]; 16 17 void indexNext() { 18 int k = 0; 19 next[1] = 0; 20 for (int i=2; pat[i]; ++i) { 21 while (k && pat[k+1]!=pat[i]) k = next[k]; 22 if (pat[k+1] == pat[i]) ++k; 23 next[i] = k; 24 } 25 } 26 27 bool kmp() { 28 int k = 0; 29 int lenPat = strlen(pat) - 1; 30 for (int i=1; str[i]; ++i) { 31 while (k && pat[k+1]!=str[i]) k = next[k]; 32 if (pat[k+1] == str[i]) ++k; 33 if (k == lenPat) return true; 34 } 35 return false; 36 } 37 38 int main() { 39 pat[0] = str[0] = '#'; 40 while (scanf("%s%s", str+1, pat+1) != EOF) { 41 int len = strlen(str); 42 if (strlen(pat) > len) {puts("no"); continue;} 43 for (int i=1; i<len; ++i) str[len+i-1] = str[i]; 44 str[(len<<1)-1] = '\0'; 45 indexNext(); 46 if (kmp()) puts("yes"); 47 else puts("no"); 48 } 49 return 0; 50 }