疑问
暂无
代码
#include<cstdio>
#include<iostream>
#include<string.h>
using namespace std;
const int maxn = 260;
int n;
char pattern[maxn];
char text[maxn];
//首先是求解npattern的next数组
void getNext(char s[],int len,int next[]){
//初始化操作
int j = -1;
next[0] = -1;
//是从1开始的
for(int i=1;i<len;i++){
while(j != -1 && s[i] != s[j+1]){
j = next[j];
}
if(s[i] == s[j+1]){
j++;
}
next[i] = j;
}
}
int KMP(char text[],char pattern[],int next[]){
int j = -1;
int len = strlen(text);
int m = strlen(pattern);
int ans = 0;
for(int i=0;i<len;i++){
while(j != -1 && text[i] != pattern[j+1]){
j = next[j];
}
if(text[i] == pattern[j+1]){
j++;
}
if(j == m-1){
ans++;
j = next[j];
}
}
return ans;
}
int main(){
int next[maxn];
scanf("%d",&n);
getchar();
cin.getline(pattern,260);
getNext(pattern,strlen(pattern),next);
int ans = 0;
for(int i=0;i<n;i++){
cin.getline(text,260);
ans += KMP(text,pattern,next);
}
printf("%d",ans);
return 0;
}
反思
- 这里没有用优化过的
nextVal
数组了,其实应该要用的,这样时间会快一些;
代码:
//#include<cstdio>
#include<iostream>
#include<string.h>
using namespace std;
const int maxn = 260;
int n;
char pattern[maxn];
char text[maxn];
//首先是求解npattern的nextVal数组
void getNext(char s[],int len,int nextVal[]){
//初始化操作
int j = -1;
nextVal[0] = -1;
//是从1开始的
for(int i=1;i<len;i++){
while(j != -1 && s[i] != s[j+1]){
j = nextVal[j];
}
if(s[i] == s[j+1]){
j++;
}
if(j == -1 || s[i+1] != s[j+1]){
nextVal[i] = j;
}else{
nextVal[i] = nextVal[j];
}
}
}
int KMP(char text[],char pattern[],int nextVal[]){
int j = -1;
int len = strlen(text);
int m = strlen(pattern);
int ans = 0;
for(int i=0;i<len;i++){
while(j != -1 && text[i] != pattern[j+1]){
j = nextVal[j];
}
if(text[i] == pattern[j+1]){
j++;
}
if(j == m-1){
ans++;
j = nextVal[j];
}
}
return ans;
}
int main(){
int nextVal[maxn];
scanf("%d",&n);
getchar();
cin.getline(pattern,260);
getNext(pattern,strlen(pattern),nextVal);
int ans = 0;
for(int i=0;i<n;i++){
cin.getline(text,260);
ans += KMP(text,pattern,nextVal);
}
printf("%d",ans);
return 0;
}
- 使用了
getline()
函数;