思路: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;
}