题目
试题编号 | 201409-3 |
---|---|
试题名称 | 字符串匹配 |
时间限制 | 1s |
内存限制 | 256MB |
问题描述 | ![]() |
输入输出 | ![]() |
样例 | ![]() |
样例说明 | ![]() |
KMP算法构建前缀树以及优化:
参考链接:
AC代码
#include <bits/stdc++.h>
#define rep(i,a,n) for(int i=a;i<n;i++)
int f[100]={0};
char T[100];
char T1[100];
char p[100];
int sign,n;
inline void getf(char *a){
int m = strlen(a);//很关键
f[0] = -1;
int k=-1,j=0;
while(j<m-1){//如果用的是字符串类型的size(),这是个unsigned int,那么j=-1会被强制转换
if(!~k||a[k]==a[j]){
//注释部分为关键优化点
// if(a[++k]==a[++j]){
// f[j] = f[k];
// }
// else f[j] = k;
f[++j] = ++k;
}
else k = f[k];
}
}
bool search(char *t,char *a){
int m1 = strlen(t),m2 = strlen(a);
getf(a);
int i=0,j=0;
while(i<m1&&j<m2){
if(!~j||t[i]==a[j])i++,j++;
else j = f[j];
}
if(j==m2)return true;
else return false;
}
int main(){
auto low=[&](char *a){
int m = strlen(a);
rep(i,0,m)
a[i]=tolower(a[i]);
};
scanf("%s",T);
scanf("%d%d",&sign,&n);
if(!sign)low(T);
while(n--){
scanf("%s",p);
strcpy(T1,p);
if(!sign)low(p);
if(search(p,T))
printf("%s\n",T1);
}
return 0;
}