水题
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; }