PS: 写三个程序测试这道题目,开始用库函数里面的strstr用0msAC, 思考strstr是怎么实现的,然后用KM匹配求失败函数15MS,感觉求失败函数的时候有时间开销
然后又手写朴素字符串匹配也是0MS。
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 100005;
//Accepted 2203 0MS 432K 523 B C++ Achiberx
char str[maxn*2];
char str1[maxn];
char str2[maxn];
int main()
{
while(gets(str1) && str1[0]) {
gets(str2);
strcpy(str, str1);
strcat(str, str1);
int len = strlen(str);
str[len-1] = '\0';
char *res = strstr(str, str2);
if(res) printf("yes\n");
else printf("no\n");
}
return 0;
}
然后用KM匹配。
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 100005;
char str[maxn*2];
char str1[maxn];
char str2[maxn];
int f[maxn];
//2203 15MS 628K 1068 B C++ Achiberx
void getFail() {
int len = strlen(str2);
f[0] = 0, f[1] = 0;
int j = 0;
for(int i = 1; i < len; i++) {
j = f[i];
while(j && str2[i]!=str2[j]) j = f[j];
f[i+1] = str2[i]==str2[j] ? j+1 : 0;
}
}
bool match() {
int len = strlen(str);
int len2 = strlen(str2);
int j = 0;
for(int i = 0; i < len; i++) {
while(j && str[i]!=str2[j]) j = f[j];
if(str[i]==str2[j]) j++;
if(j==len2) return true;
}
return false;
}
int main()
{
while(gets(str1) && str1[0]) {
gets(str2);
strcpy(str, str1);
strcat(str, str1);
int len = strlen(str);
str[len-1] = '\0';
getFail();
bool res = match();
if(res) printf("yes\n");
else printf("no\n");
}
return 0;
}
手写朴素匹配
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 100005;
//2203 0MS 432K 879 B C++ Achiberx
char str[maxn*2];
char str1[maxn];
char str2[maxn];
bool match(char* src, char* des) {
int len1 = strlen(src);
int len2 = strlen(des);
int j = 0;
for(int i = 0; i < len1; i++) {
if(src[i]==des[j]) {
j++;
}
if(j==len2) return true;
if(j && src[i]!=des[j-1]) j = 0;
}
return false;
}
int main()
{
while(gets(str1) && str1[0]) {
gets(str2);
strcpy(str, str1);
strcat(str, str1);
int len = strlen(str);
str[len-1] = '\0';
bool res = match(str, str2);
if(res) printf("yes\n");
else printf("no\n");
}
return 0;
}