• 病毒侵袭 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
  • 相关阅读:
    十六进制内存赋值
    opcode修改
    C/C++ strtok函数
    pat1033. To Fill or Not to Fill (25)
    pat1008. Elevator (20)
    pat1089. Insert or Merge (25)
    pat1091. Acute Stroke (30)
    pat1002. A+B for Polynomials (25)
    pat1090. Highest Price in Supply Chain (25)
    pat1088. Rational Arithmetic (20)
  • 原文地址:https://www.cnblogs.com/yijiull/p/7388317.html
Copyright © 2020-2023  润新知