水题
2896:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int ch[111111][128],val[111111];
int f[111111],last[111111];
int sz,n,m;
char str[222];
char str2[11111];
int ans;
bool b[555];
void init()
{
sz=0;
memset(ch[0],0,sizeof(ch[0]));
}
void insert(char *a,int vv)
{
int u=0,l=strlen(a);
for(int i=0;i<l;i++)
{
int c=a[i]-' ';
if(!ch[u][c])
{
ch[u][c]=++sz;
memset(ch[sz],0,sizeof(ch[sz]));
val[sz]=0;
}
u=ch[u][c];
}
val[u]=vv;
}
void getfail()
{
queue<int>q;
f[0]=0;
for(int i=0;i<128;i++)
{
int u=ch[0][i];
if(u)
{
f[u]=0;
q.push(u);
last[u]=0;
}
}
while(!q.empty())
{
int r=q.front();
q.pop();
for(int i=0;i<128;i++)
{
int u=ch[r][i];
if(!u)continue;
q.push(u);
int v=f[r];
while(v&&!ch[v][i])v=f[v];
f[u]=ch[v][i];
last[u]=val[f[u]]?f[u]:last[f[u]];
}
}
}
void query(char *a)
{
ans=0;
memset(b,0,sizeof(b));
int l=strlen(a);
int u=0;
for(int i=0;i<l;i++)
{
int c=a[i]-' ';
while(u&&!ch[u][c])u=f[u];
if(ch[u][c])u=ch[u][c];
else u=0;
int temp=u;
while(temp&&(b[val[temp]]==0||val[temp]==0))
{
if(val[temp])
{
ans++;
b[val[temp]]=1;
}
temp=last[temp];
}
}
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
getchar();
init();
for(int i=1;i<=n;i++)
{
gets(str);
insert(str,i);
}
getfail();
scanf("%d",&m);
getchar();
int cnt=0;
for(int i=1;i<=m;i++)
{
gets(str2);
query(str2);
if(ans!=0)
{
cnt++;
printf("web %d:",i);
for(int j=1;j<=n;j++)
{
if(b[j])printf(" %d",j);
}
printf("\n");
}
}
printf("total: %d\n",cnt);
}
return 0;
}
3065:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int ch[51111][128],val[51111];
int f[51111],last[51111];
int sz,n,m;
char str[1111][55];
char str2[2222222];
int ans;
int b[1111];
void init()
{
sz=0;
memset(ch[0],0,sizeof(ch[0]));
}
void insert(char *a,int vv)
{
int u=0,l=strlen(a);
for(int i=0;i<l;i++)
{
int c=a[i]-' ';
if(!ch[u][c])
{
ch[u][c]=++sz;
memset(ch[sz],0,sizeof(ch[sz]));
val[sz]=0;
}
u=ch[u][c];
}
val[u]=vv;
}
void getfail()
{
queue<int>q;
f[0]=0;
for(int i=0;i<128;i++)
{
int u=ch[0][i];
if(u)
{
f[u]=0;
q.push(u);
last[u]=0;
}
}
while(!q.empty())
{
int r=q.front();
q.pop();
for(int i=0;i<128;i++)
{
int u=ch[r][i];
if(!u)continue;
q.push(u);
int v=f[r];
while(v&&!ch[v][i])v=f[v];
f[u]=ch[v][i];
last[u]=val[f[u]]?f[u]:last[f[u]];
}
}
}
void query(char *a)
{
memset(b,0,sizeof(b));
int l=strlen(a);
int u=0;
for(int i=0;i<l;i++)
{
int c=a[i]-' ';
while(u&&!ch[u][c])u=f[u];
if(ch[u][c])u=ch[u][c];
else u=0;
int temp=u;
while(temp)
{
if(val[temp])b[val[temp]]++;
temp=last[temp];
}
}
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
getchar();
init();
for(int i=1;i<=n;i++)
{
gets(str[i]);
insert(str[i],i);
}
getfail();
scanf("%s",str2);
query(str2);
for(int i=1;i<=n;i++)
{
if(b[i])printf("%s: %d\n",str[i],b[i]);
}
}
return 0;
}