hdu 2896 病毒侵袭

简介: 点击打开链接hdu 2896 思路:AC自动机 分析: 1 题目输入n个字符串,然后输入m个源码串。对每一个源码串要求找到里面包含了几个字符串,如果有包含则按照从小到大输出字符串的编号,否则不输出。

点击打开链接hdu 2896


思路:AC自动机
分析:
1 题目输入n个字符串,然后输入m个源码串。对每一个源码串要求找到里面包含了几个字符串,如果有包含则按照从小到大输出字符串的编号,否则不输出。
2 典型的ac自动机。首先利用n个字符串建立字典树并且在字典树上面求出失配指针。然后对每一个输入的源码串进行find()即可。

3 ASCLL字符表可见字符(可打印字符)从32~126


代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;

#define INF 0x3f3f3f3f /*这个值可以用来初始化数组*/
#define MAXN 100010
#define N 110

int n , m , sum , cnt;
int ans[3];
struct Node{
   Node* next;
   Node* child[N];
   int number;/*标记编号*/
   int pos;/*标记有没有被用过*/
};
Node node[MAXN];
Node *root;
queue<Node*>q;

Node* newNode(){
    node[cnt].next = NULL;
    node[cnt].number = 0;
    node[cnt].pos = 0;
    for(int i = 0 ; i < N ; i++)
        node[cnt].child[i] = NULL;
    return &node[cnt++];
}

void insert(char *str , int x){
    Node *p = root;
    int len = strlen(str);

    for(int i = 0 ; i < len ; i++){
       int num = str[i]-32;
       if(p->child[num] == NULL)
         p->child[num] = newNode();
       p = p->child[num];
    }
    p->number = x;
}

void getNext(){
    
    while(!q.empty())
       q.pop();
    q.push(root);
    root->next = NULL;

    while(!q.empty()){
       Node *p = q.front();
       q.pop();

       for(int i = 0 ; i < N ; i++){
          if(p->child[i]){
            q.push(p->child[i]);
            Node *tmp = p->next;

            while(tmp){
              if(tmp->child[i]){
                p->child[i]->next = tmp->child[i];
                break;
              }
              tmp = tmp->next;
            }
            if(tmp == NULL)
              p->child[i]->next = root;
          }
       }
    }
}

void find(char *str , int x){
    
    int len = strlen(str);
    int pos = 0;
    Node *p = root;

    for(int i = 0 ; i < len ; i++){
       int num = str[i]-32;
       while(p->child[num] == NULL && p != root)
           p = p->next;
       if(p->child[num]){
           p = p->child[num];
           Node *tmp = p;
           while(tmp){
              if(tmp->number){
                if(tmp->pos != x){/*如果没有被用过那么保存到ans数组里面*/
                  ans[pos++] = tmp->number;
                  tmp->pos++;
                }
              }
              tmp = tmp->next;       
           }
       }
    }
}

int main(){
   char str[MAXN];
   while(scanf("%d%*c" , &n) != EOF){
      sum = cnt = 0;
      root = newNode();
       
      for(int i = 1 ; i <= n ; i++){
         gets(str);
         insert(str , i);
      }
      getNext();
      scanf("%d%*c" , &m);
      for(int i = 1 ; i <= m ; i++){
         gets(str);
         memset(ans , INF , sizeof(ans));/*初始化为INF*/
         find(str , i);
         if(ans[0] == INF)
            continue;
         printf("web %d:" , i);
         sort(ans , ans+3);/*排序*/
         for(int j = 0 ; j < 3 ; j++){
            if(ans[j] == INF)
              break;
            printf(" %d" , ans[j]);
         }
         printf("\n");
         sum++;
      }
      printf("total: %d\n" , sum);
   }
   return 0;
}



目录
相关文章
|
安全
Conficker病毒新变种卷土重来 可关闭杀毒软件
据国外媒体报道,安全厂商赛门铁克今天表示,发现了Conficker蠕虫病毒的一个新变种,它可以识别被感染计算机上的反病毒软件或安全分析工具,并试图关闭这些程序。 Conficker蠕虫病毒自出现以来,已经感染了全球上千万台计算机,但是该病毒最初的行为只是恶意传播自身,并不会给感染计算机带来进一步伤害。
993 0
|
安全
端午小长假谨防挂马网站 病毒模仿杀软骗取钱财
随着端午小长假的临近,上网人数增加,这段时间的挂马网站和木马病毒都有肆虐的趋势。5月25日,瑞星“云安全”系统就从截获的挂马网站中,发现了一个冒充杀毒软件、企图骗取钱财的广告软件病毒,并命名为“WINPC 广告病毒(Adware.Win32.Agent.Dbj)”。
1061 0
|
安全
怀旧小虎队 谨防挂马网站和极虎病毒
“把你的心,我的心串一串,串一株幸运草,串一个同心圆,让所有期待未来的呼唤,趁青春做个伴……”小虎队唱着歌曲亮相春晚后,掀起了一股怀旧风——“80后”都是听着小虎队的歌长大的。 小虎队再度火了,搜索关键词“小虎队”的网民呈现爆炸式增长(图1),关键词“小虎队”蕴藏的“价值”自然逃不过挂马集团贪婪的眼睛,他们明白,如果利用关键词“小虎队”进行挂马,会有数以百万计、千万计的网民中招。
1069 0
|
安全 区块链 数据安全/隐私保护
|
Web App开发 安全
想哭(WannaCry)勒索病毒最新情报汇总:首个工作日,多少电脑中招?
本文讲的是想哭(WannaCry)勒索病毒最新情报汇总:首个工作日,多少电脑中招?,今天是想哭(Wannacry)勒索病毒遇到的第一个工作日,也是全球各大安全公司预测的“二次爆发日”。
1444 0