您的位置:首页 > 其它

hiho 第218周 Keywords Filter(kmp | AC自动机)

2018-09-06 15:19 260 查看

KMP+差分

可重查询出现次数的套路,出现的那边用差分处理下,最后再判断下即可。

//218 纯kmp
#include <set>
#include <map>
#include <queue>
#include <deque>
#include <stack>
#include <cmath>
#include <cstdio>
#include <vector>
#include <string>
#include <cstring>
#include <fstream>
#include <iostream>
#include <algorithm>
using namespace std;

#define eps 1e-8
#define PI acos(-1.0)
#define INF 0x3f3f3f3f
#define FAST_IO ios::sync_with_stdio(false)

const int N=100000+10;
typedef long long LL;
int Next
,len1;
char s
;
int vis
;

void Get_Next(char *p,int len){
int i=0,j=Next[0]=-1;
while(i<len){
while(j!=-1&&p[i]!=p[j]) j=Next[j];
Next[++i]=++j;
}
}

void kmp(char *p){
int i,j;
i=j=0;
int len2=strlen(p);
Get_Next(p,len2);
while(i<len1){
while(j!=-1&&s[i]!=p[j]) j=Next[j];
i++,j++;
if(j==len2){
vis[i-len2]+=1;vis[i]-=1;
j=Next[j];
}
}
}

int main(){
int n;
scanf("%d",&n);
char p[n+1][N/n+100];
for(int i=1;i<=n;i++) scanf("%s",p[i]);
scanf("%s",s);
len1=strlen(s);
for(int i=1;i<=n;i++) kmp(p[i]);
for(int i=1;i<=len1;i++) vis[i]+=vis[i-1];
for(int i=0;i<len1;i++) printf("%c",vis[i]>0?'*':s[i]);
return 0;
}
View Code

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: