思路:kmp
分析:
1 题目要求的是给定字符串s1 和 s2,问s1能否通过移位得到使得s2包含在s1里面。
2 很显然的kmp的模板题,只须在s1后面在添上一个s1即可。这里特别注意strcat的使用
3 strcat函数,函数的原行strcat(char *s , char *p);注意这里的s和p所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串;所以假设s = “abc”,现在想得到“abcabc”那么不能直接的strcat(s , s),而是先用一个tmp数组存储s,即strcpy(tmp , s , sizeof(s)) , 然后在strcat(s , tmp);
代码:
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> using namespace std; #define MAXN 200010 char text[MAXN]; char pattern[MAXN]; int next[MAXN]; void getNext(){ int m = strlen(pattern); next[0] = next[1] = 0; for(int i = 1 ; i < m ; i++){/*这里是从1开始的*/ int j = next[i]; while(j && pattern[i] != pattern[j]) j = next[j]; next[i+1] = pattern[i] == pattern[j] ? j+1 : 0; } } bool find(){ int n = strlen(text); int m = strlen(pattern); int j = 0;/*模式串的起点*/ for(int i = 0 ; i < n ; i++){ while(j && pattern[j] != text[i]) j = next[j];/*顺着失配边走*/ if(pattern[j] == text[i])/*这个要先判断才判断j是否等与m*/ j++; if(j == m)/*找到了return true*/ return true; } return false; } int main(){ while(scanf("%s" , text) != EOF){ scanf("%s" , pattern); char tmp[MAXN]; memcpy(tmp , text , sizeof(text));/*先复制给tmp*/ strcat(text , tmp);/*tmp在复制给text*/ getNext(); if(find()) printf("yes\n"); else printf("no\n"); } return 0; }