病毒侵袭 HDU

病毒侵袭

 HDU - 2896 

题意:统计长串中出现了哪些短串

用vector存一下,再输出

  1 #include <bits/stdc++.h>
  2 using namespace std;
  3 #define CLR(m,a) memset(m,a,sizeof(m))
  4 
  5 const int maxnode=500*200+10;
  6 const int sigma=128;
  7 
  8 struct AC
  9 {
 10     int ch[maxnode][sigma],last[maxnode],f[maxnode],val[maxnode];
 11     int sz;
 12     vector<int> ans;
 13 
 14     void init()
 15     {
 16         CLR(ch[0],0);
 17         val[0]=0;
 18         sz=1;
 19     }
 20     int idx(char c){return c;}
 21 
 22     void inser(char *s,int v)
 23     {
 24         int u=0,n=strlen(s);
 25         for(int i=0;i<n;i++){
 26             int c=idx(s[i]);
 27             if(!ch[u][c]){
 28                 CLR(ch[sz],0);
 29                 val[sz]=0;
 30                 ch[u][c]=sz++;
 31             }
 32             u=ch[u][c];
 33         }
 34         val[u]=v;
 35     }
 36 
 37     void getfail()
 38     {
 39         queue<int> q;
 40         f[0]=0;
 41         for(int c=0;c<sigma;c++){
 42             int u=ch[0][c];
 43             if(u){
 44                 q.push(u);
 45                 f[u]=0;
 46                 last[u]=0;
 47             }
 48         }
 49         while(!q.empty()){
 50             int r=q.front();
 51             q.pop();
 52             for(int c=0;c<sigma;c++){
 53                 int u=ch[r][c];
 54                 if(!u) continue;
 55                 q.push(u);
 56                 int v=f[r];
 57                 while(v&&!ch[v][c]) v=f[v];
 58                 f[u]=ch[v][c];
 59                 last[u]=val[f[u]]?f[u]:last[f[u]];
 60             }
 61         }
 62     }
 63     void print(int u)
 64     {
 65         if(u){
 66             ans.push_back(val[u]);
 67             print(last[u]);
 68         }
 69     }
 70     void fin(char *s)
 71     {
 72         ans.clear();
 73         int u=0,n=strlen(s);
 74         for(int i=0;i<n;i++){
 75             int c=idx(s[i]);
 76             while(u&&!ch[u][c]) u=f[u];
 77             u=ch[u][c];
 78             if(val[u]) print(u);
 79             else if(last[u]) print(last[u]);
 80         }
 81     }
 82 };
 83 AC ac;
 84 char s[210],t[10010];
 85 int n,m;
 86 
 87 int main()
 88 {
 89     while(scanf("%d",&n)!=EOF)
 90     {
 91         ac.init();
 92         int cnt=0;
 93         for(int i=1;i<=n;i++)
 94         {
 95             scanf("%s",s);
 96             ac.inser(s,i);
 97         }
 98         ac.getfail();
 99         scanf("%d",&m);
100         for(int i=0;i<m;i++){
101             scanf("%s",t);
102             ac.fin(t);
103             for(int j=0;j<ac.ans.size();j++)
104             {
105                 sort(ac.ans.begin(),ac.ans.end());
106                 if(j==0){
107                     printf("web %d: %d",i+1,ac.ans[j]);
108                 }
109                 else printf(" %d",ac.ans[j]);
110                 if(j==ac.ans.size()-1) cnt++,puts("");
111             }
112         }
113         printf("total: %d
",cnt);
114     }
115 }
View Code
原文地址:https://www.cnblogs.com/yijiull/p/7388317.html