题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2203
题目描述:给定两个串s1,s2,问是否能够通过对s1串进行位移操作使得新串ss1中包含s2
解题思路:看到题目,我们假设可以通过位移使得s1中含s2,即s1前面的串可以用在串的后面使得s2可以匹配,这样很自然地想到在s1后面在补上s1,让两个s1拼接一个新串ss,在ss中计算next数组,再让s2与ss匹配即可。
测试数据:
cc a
ccc aa
代码:
#include <stdio.h> #include <string.h> #define MAX 100010 int la,lb,lc,next[MAX*2]; char s1[MAX],s2[MAX],s3[MAX*2]; int KMP() { int i,j,k; strcpy(s3,s1),strcat(s3,s1); lc = strlen(s3); //next[] i = 0,j = -1,next[i] = -1; while (s3[i]) { if (j == -1 || s3[i] == s3[j]) i++,j++,next[i] = j; else j = next[j]; } //match() i = j = 0; while (s3[i]) { if (j == -1|| s3[i] == s2[j]) i++,j++; else j = next[j]; if (j == lb) return 1; } return 0; } int main() { while (scanf("%s%s",s1,s2) != EOF) { la = strlen(s1); lb = strlen(s2); if (la < lb) { printf("no\n"); continue; } else { int flag = KMP(); printf(flag ? "yes\n" : "no\n"); } } }