您的位置:首页 > 其它

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