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
相关文章推荐
- hiho 第4周 Trie图(AC自动机 | KMP)
- hiho 之KMP
- UVALive 3026 Period (KMP上的dp,学习ac自动机的前奏)
- KMP与AC自动机资料推荐
- hiho第三周 KMP
- HDU 5510 Bazinga(模拟双向链表或kmp或AC自动机)
- 哈希标记取代(KMP和AC自动机)poj3690
- 字符串专题(trie,KMP,AC自动机,manacher)
- 【BZOJ3942】[Usaco2015 Feb]Censoring【AC自动机 / KMP】
- AC自动机(多模式串“KMP")模版
- 从kmp到ac自动机
- 【BZOJ3940】[Usaco2015 Feb]Censoring【AC自动机 / KMP】
- hiho 1015 KMP
- hiho一下 KMP 算法
- 字符串小记(KMP, AC自动机, Manacher)
- 字符串系列——KMP、AC自动机、回文自动机
- 【hiho一下第三周】KMP计算模式串在原串出现次数
- 串算法1 Trie+KMP+Aho-Corasick自动机(AC自动机)
- 关于Trie KMP AC自动机
- hiho 1015 KMP