UVA 1019 Matrix Matcher(AC自动机)
2016-10-27 08:52
381 查看
没想到这题有重复的行= =。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; const int maxnode=10000+5; int n,m,x,y; int tr; char T[1005][1005],P[105][105]; int repr[105],Next[105]; int cnt[1005][1005]; struct DFA{ int ch[maxnode][26]; int f[maxnode]; int val[maxnode]; int sz; void clear() {sz=1;memset(ch[0],0,sizeof(ch[0]));} int idx(char c) {return c-'a';} void insert(char *s,int v) { int u=0; for(int i=0;s[i];i++) { int c=idx(s[i]); if(!ch[u][c]) { memset(ch[sz],0,sizeof(ch[0])); val[sz]=0; ch[u][c]=sz++; } u=ch[u][c]; } val[u]=v; } void getfail() { queue<int> q; f[0]=0; for(int c=0;c<26;c++){ int u=ch[0][c]; if(u) {f[u]=0;q.push(u);} } while(!q.empty()) { int r=q.front();q.pop(); for(int c=0;c<26;c++) { int u=ch[r][c]; if(!u) {ch[r][c]=ch[f[r]][c];continue;} q.push(u);int v=f[r]; while(v&&!ch[v][c]) v=f[v]; f[u]=ch[v][c]; } } } void process_match(int r,int c,int v) { int pr=repr[v]; while(pr>=0) { if(tr>=pr) cnt[r-pr+1][c]++; pr=Next[pr]; } } void find(char *s,int x) { int j=0; for(int i=0;s[i];i++) { int c=idx(s[i]); j=ch[j][c]; if(val[j]) process_match(x,i,val[j]); } } }; DFA ac; #define ss(x) scanf("%d",&x) int main() { int t;ss(t); while(t--) { ss(n);ss(m); for(int i=1;i<=n;i++) scanf("%s",T[i]); ac.clear(); ss(x);ss(y); for(int i=1;i<=x;i++) { scanf("%s",P[i]); repr[i]=i; Next[i]=-1; for(int j=1;j<i;j++) if(strcmp(P[i],P[j])==0) { repr[i]=j; Next[i]=Next[j]; Next[j]=i; break; } if(repr[i]==i) ac.insert(P[i],i); } ac.getfail(); memset(cnt,0,sizeof(cnt)); for(tr=1;tr<=n;tr++) { ac.find(T,tr); } int ans=0; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(cnt[i][j]==x) ans++; cout<<ans<<endl; } } 相关文章推荐
- UVa:11019 Matrix Matcher(AC自动机)
- UVA-11019 - Matrix Matcher(AC自动机)
- UVA 11019 Matrix Matcher(AC自动机:矩阵匹配)
- uva 11019 - Matrix Matcher(AC自动机)
- uva 11019 Matrix Matcher (ac自动机二维匹配)
- UVA 11019 Matrix Matcher(AC自动机)
- UVA-11019 - Matrix Matcher(AC自动机)
- UVA 11019 Matrix Matcher(ac自动机)
- UVA-11019Matrix Matcher(AC自动机)
- UVA 11019(Matrix Matcher-vector从迭代器中取值,AC自动机匹配字符矩阵)
- UVa 1449 - Dominating Patterns (AC自动机)
- uvalive 3907 Puzzle (ac自动机+有向图判环+dp)
- uva-1449-AC自动机
- UVA 1399 - Puzzle(AC自动机+DP)
- UVALive 5103 / HDU 3695 Computer Virus on Planet Pandora(AC自动机裸)
- UVA-11468 - Substring (AC自动机)
- UVA 11468 —— Substring(AC自动机+DP)
- UVA 11468(Substring-AC自动机上dp)[Template:AC自动机]
- uva 11468 AC自动机+概率DP
- UVA 1076 - Password Suspects(AC自动机+DP)