hdu 2896 病毒侵襲 ac自動機

  1 /*
  2 hdu 2896 病毒侵襲 ac自動機 
  3 從題意得知,模式串中沒有重復的串出現,所以結構體中可以將last[](后綴鏈接)數組去掉 
  4 last[]數組主要是記錄具有相同后綴模式串的末尾節點編號 。本題中主要是計算每一個模式串
  5 在主串中有沒有出現過,而不是計算出現過多少次,所以將last[]數組省掉.... 
  6 */ 
  7 #include<algorithm>
  8 #include<iostream>
  9 #include<cstdio>
 10 #include<cstring>
 11 #include<queue> 
 12 #define N 210*500
 13 using namespace std;
 14 class AC_atomata
 15 {
 16 public:
 17    int trie[N][128],  f[N], val[N];
 18    int vis[510];
 19    int nodeN;
 20    int total;
 21    queue<int>q;
 22    void init()
 23    {
 24       nodeN=0;
 25       val[0]=0;
 26       total=0;
 27       while(!q.empty()) q.pop();
 28       memset(trie[0], 0, sizeof(trie[0]));
 29    }
 30    void build(char *str, int index);//建立trie樹 
 31    void getFail();//失配函數 
 32    void find(char *T, int n, int index);//查找函數 
 33 };
 34 
 35 
 36 void AC_atomata::build(char *str, int index)
 37 {
 38     int i, u;
 39     for(i=0, u=0; str[i]; ++i)
 40     {
 41         int ch=str[i];
 42         if(!trie[u][ch])
 43         {
 44             trie[u][ch]=++nodeN;
 45             memset(trie[nodeN], 0, sizeof(trie[nodeN]));
 46     }
 47     u=trie[u][ch];
 48     val[u]=0;
 49     }
 50     val[u]=index;
 51 }
 52 
 53 void AC_atomata::getFail()
 54 {
 55    int r, u, v, i;
 56    f[0]=0;
 57    for(i=0; i<128; ++i)
 58    {
 59        if(trie[0][i])
 60        {
 61              q.push(trie[0][i]);
 62              f[trie[0][i]]=0;
 63        }
 64    }
 65    while(!q.empty())
 66    {
 67       r=q.front();
 68       q.pop();
 69       for(i=0; i<128; ++i)
 70       {
 71             u=trie[r][i];
 72             if(!u) continue;
 73             q.push(u);
 74             v=f[r];
 75             while(v && !trie[v][i]) v=trie[v][i];
 76             f[u]=trie[v][i];
 77       }
 78    }
 79 }
 80 
 81 void AC_atomata::find(char *T, int n, int index)
 82 {
 83     int i, u;
 84     int cnt=0, v[3];
 85     memset(v, 0, sizeof(v));
 86     memset(vis, 0, sizeof(vis));//每一次查找將數組初始化,開始忘記初始化了, 哇了好多次 
 87     for(i=0, u=0; T[i]; ++i)
 88     {
 89         int ch=T[i];
 90         while(u && !trie[u][ch])  u=f[u];
 91         u=trie[u][ch];
 92         if(val[u] && !vis[val[u]])
 93         {
 94             v[cnt++]=val[u];
 95             vis[val[u]]=1;
 96             if(cnt>2) break;
 97         }
 98     }
 99     if(cnt>0)
100     {
101         ++total;
102         printf("web %d:", index);
103         sort(v, v+3);
104         for(i=0; i<3; ++i)
105            if(v[i])  printf(" %d", v[i]);
106         printf("\n");
107     }
108 }
109 
110 AC_atomata ac;
111 char T[10005], s[205];
112 
113 int main()
114 {
115    int n, m, i;
116    while(scanf("%d", &n)!=EOF)
117    {
118        ac.init();
119        for(i=1; i<=n; ++i)
120         {
121            scanf("%s", s);
122            ac.build(s, i);
123     }
124        ac.getFail();
125        scanf("%d", &m);
126        for(i=1; i<=m; ++i)
127        {
128              scanf("%s", T);
129              ac.find(T, n, i);
130        }
131        printf("total: %d\n", ac.total);
132    }
133    return 0;
134 } 
  1 /*
  2     上面的程序過了,感覺數據很水....
  3 */
  4 #include<iostream>
  5 #include<cstdio>
  6 #include<cstring>
  7 #include<queue>
  8 #define N 100005 
  9 #define M 505
 10 using namespace std;
 11 int n, m;
 12 class AC_atomata
 13 { 
 14 public:
 15     int trie[N][128], fail[N];
 16     int cnt;
 17     int vis[M];//標記邊 
 18     int nodeN;//節點數 
 19     int val[N];//標記字符節點是否為單詞末尾 
 20     queue<int>q;
 21     void init();
 22     void build(char *T, int index) ;
 23     void getFail();
 24     void find(char *S, int index);
 25 };
 26 
 27 void AC_atomata:: init()
 28 {
 29    while(!q.empty())  q.pop();
 30    memset(trie[0], 0, sizeof(trie[0]));
 31    nodeN=0;
 32    cnt=0;
 33    memset(val, 0, sizeof(val));
 34 }
 35 
 36 void AC_atomata:: build(char *T, int index)
 37 {
 38     int i, u=0;
 39     for(i=0; T[i]; ++i)
 40     {
 41         if(trie[u][T[i]]==0)
 42         {
 43             trie[u][T[i]]=++nodeN;
 44             memset(trie[nodeN], 0, sizeof(trie[nodeN]));
 45     }
 46     val[u]=0;
 47     u=trie[u][T[i]];
 48     }
 49     val[u]=index;
 50 }
 51 
 52 void AC_atomata:: getFail()
 53 { 
 54     int r, u, v; 
 55     int c, root=0;
 56     fail[root]=0;
 57     for(c=0; c<128; ++c)
 58     {
 59         if(v=trie[root][c])
 60         {
 61             fail[v]=root;
 62             q.push(v);
 63     }
 64     }
 65     while(!q.empty())
 66     {
 67         r=q.front(); q.pop();
 68     for(c=0; c<128; ++c)
 69     {
 70         u=trie[r][c];
 71         if(!u)//該節點不存在,也就是查找過程中每一個節點都是平等的
 72            trie[r][c]=trie[fail[r]][c];
 73         else
 74         {
 75             fail[u]=trie[fail[r]][c];
 76             q.push(u);
 77         }
 78     } 
 79     } 
 80 } 
 81 
 82 void AC_atomata:: find(char *S, int index)
 83 {
 84    int cur, root, count=0;
 85    cur=root=0;
 86    memset(vis, 0, sizeof(vis));
 87    for(int i=0; S[i]; ++i)
 88    {
 89        cur=trie[cur][S[i]];
 90        int next=cur;

? ? ? ? ? //這個while循環就是last[]數組實現的功能,只不過是last[]數組記錄的總是單詞結尾字符的節點的編號
? ? ? ? ? //而我們通過沿著 next 節點的失配方向一直搜索, 也可以尋找到 以next節點所對應字符結尾的單詞

 91        while(next!=root)
 92        {
 93               if(val[next])
 94                  {
 95               vis[val[next]]=1;
 96               count++;
 97           }
 98               next=fail[next];
 99        } 
100    }
101    if(count>0)
102    {
103        ++cnt;
104        printf("web %d:", index);
105        for(int i=1; i<=n; ++i)
106          if(vis[i])
107            printf(" %d", i);
108        printf("\n");
109    }
110 } 
111 
112 char t[205], s[10005];
113 AC_atomata ac;
114 int main()
115 {   
116    int i;
117    while(scanf("%d", &n)!=EOF)
118    {
119        ac.init();
120        for(i=1; i<=n; ++i) 
121        {
122              scanf("%s", t);
123              ac.build(t, i);
124        }
125        ac.getFail();
126        scanf("%d", &m) ;
127        for(i=1; i<=m; ++i)
128        {
129              scanf("%s", s);
130              ac.find(s, i);
131        }
132        printf("total: %d\n", ac.cnt);
133    }
134    return 0;
135 }

?

?

轉載于:https://www.cnblogs.com/hujunzheng/p/3801731.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/531968.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/531968.shtml
英文地址,請注明出處:http://en.pswp.cn/news/531968.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

axure原件 總是丟失_Axure實現提示文本單擊顯示后自動消失的效果

FORM一 .新增的input輸入屬性 1.email類型 在表單提交E-mail地址時,無效的輸入會生成很多無效數據,對后期的數據檢索造成一定的影響.所以在表單提交之前,需要對輸入的E-mail地址進行有效 ...Google的Protobuf協議分析protobuf和thrift類似,也是一個序列化的協議實現,簡稱PB(下文…

linux php不能寫文件內容,php 在linux系統下寫出文件問題

最近寫了一個簡單的生成文件&#xff0c;服務器用的linux 但是在將文件寫出到路徑的時候就會寫出一個其他的文件夾其中一些代碼如下define("paddy",dirname(__FILE__));$gkrequest_uri();$filepathpaddy.$gk&#xff1b;createfile($filefath,$file)&#xff1b;//$f…

python mysql刪除數據_python-mysql刪除和更新數據

刪除數據import codecsimport MySQLdbdef connect_mysql():db_config {host: 192.168.48.128,port: 3306,user: xiang,passwd: 123456,db: python,charset: utf8}cnx MySQLdb.connect(**db_config)return cnxif __name__ __main__:cnx connect_mysql()sql select * from S…

xlat指令...

1 ;就是一個串str1&#xff0c; lea ebx, str1 然后我們ebx1總是加上的是一個字節&#xff0c; 無論&#xff08;串是word&#xff0c; byte&#xff0c; dword&#xff09;2 .3863 .model flat4 .stack 40965 include io.h6 ExitProcess proto near32 stdcall, deExitCode:dwo…

php 串口通信例程,HAL庫串口通信例程

請問下 為什么要 用void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)這個函數呢?不用不行嗎&#xff1f;static void MX_USART1_UART_Init(void){huart1.Instance USART1;huart1.Init.BaudRate 9600;huart1.Init.WordLength UART_WORDLENGTH_8B;huart1.Init.Stop…

char 類型與lpcwstr_「lpctstr」char* 與 LPCTSTR 類型的互相轉換 - seo實驗室

lpctstr1.char* 轉換成 LPCTSTRchar ch[1024] "wo shi ni baba";int num MultiByteToWideChar(0,0,ch,-1,NULL,0);wchar_t *wide new wchar_t[num];MultiByteToWideChar(0,0,ch,-1,wide,num);解析&#xff1a;num 獲得長字節所需的空間MultiByteToWideChar()表示將…

poj 2195 Going Home

1 /*2 做網絡流的題建圖真的是太重要了&#xff01;3 本題是將人所在的位置和房子所在的位置建立邊的聯系&#xff0c;其中man到house這一條邊的流量為 1&#xff0c; 費用為兩者的距離4 而方向邊的流量為 0&#xff0c; 費用為正向邊的相反數&#xff08;也就是沿著反…

CardLayout布局練習(小的圖片瀏覽器)

1 /*2 涉及Panel中的圖片的加載&#xff0c;還有Frame的關閉的方法&#xff0c; CardLayout&#xff08;int hgap, int vgap&#xff09;就會決定卡片面板的大小3 匿名類的使用。。。4 */5 import java.awt.*;6 import java.awt.event.*;7 import javax.swing.*;8 public class…

python求逆矩陣的方法,Python 如何求矩陣的逆

我就廢話不多說了&#xff0c;大家還是直接看代碼吧~import numpy as npkernel np.array([1, 1, 1, 2]).reshape((2, 2))print(kernel)print(np.linalg.inv(kernel))注意&#xff0c;Singular matrix奇異矩陣不可求逆補充&#xff1a;pythonnumpy中矩陣的逆和偽逆的區別定義&a…

plsql存過聲明游標_plsql編程學習之游標一

oralce plsql編程的游標游標分類1顯示游標2隱式游標隱式游標&#xff0c;oracle自動管理&#xff0c;不用聲明&#xff0c;打開和關閉&#xff0c;ORACLE自動處理&#xff0c;使用隱式游標%FOUND時&#xff0c;需要加上 SQL%FOUND顯示游標&#xff0c;需要自己聲明&#xff0c;…

用命令行編譯java并生成可執行的jar包

用命令行編譯java并生成可執行的jar包 1.編寫源代碼。 編寫源文件&#xff1a;CardLayoutDemo.java并保存&#xff0c;例如&#xff1a;I:\myApp\CardLayoutDemo.java。程序結構如下&#xff1a;package test;import java.awt.*; import javax.swing.*; //更多包的導入...clas…

python計時器單位,python(計時器)

計時器要求&#xff1a;定制一個計時器的類start 和 stop方法代表啟動計時和停止計時假設計時器對象 t1&#xff0c;print(t1)和直接調用t1 均顯示結果當計時器未啟動或已停止計時&#xff0c;調用stop方法能給予溫馨提示兩個計時器對象可以相加&#xff1a; t1 t2只能使用提供…

查詢分析300萬筆記錄_給你100萬條數據的一張表,你將如何查詢優化?

1.兩種查詢引擎查詢速度(myIsam 引擎)InnoDB 中不保存表的具體行數&#xff0c;也就是說&#xff0c;執行select count(*) from table時&#xff0c;InnoDB要掃描一遍整個表來計算有多少行。MyISAM只要簡單的讀出保存好的行數即可。注意的是&#xff0c;當count(*)語句包含 whe…

poj 3321 Apple Trie

/*poj 3321 Apple Trie 這道題的關鍵是如何將一個樹建成一個一維數組利用樹狀數組來解題&#xff01;可以利用dfs&#xff08;&#xff09;來搞定&#xff0c;我們在對一個節點深搜后&#xff0c;所經過的節點的數目就是該節點的子樹的數目所以我們利用start[i]數組來記錄 i 節…

php美團項目分享,美團項目(純代碼)(示例代碼)

一.框架搭建1.icon規格要求可從文檔中查找,搜索app icon.2.因為很多界面重復利用,所以不用storyboarda.刪除stroyboard,在設置中Info -> Main storyboard file base name 項直接去除b.創建ZXHomeViewController(UICollectionViewController)和ZXNavigationController(UINavi…

ioc spring 上機案例_Spring的IoC入門案例

1、創建工程&#xff0c;導入坐標1.1 創建工程1.2 導入坐標xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">4.0.0org.examplespring_01_io…

java中父類與子類, 不同的兩個類中的因為構造函數由于遞歸調用導致棧溢出問題...

1 /*2 對于類中對成員變量的初始化和代碼塊中的代碼全部都挪到了構造函數中&#xff0c;3 并且是按照java源文件的初始化順序依次對成員變量進行初始化的&#xff0c;而原構造函數中的代碼則移到了構造函數的最后執行4 */5 import static java.lang.System.out;6 7 public clas…

liunx php的項目地址,在 Linux 配置 PHP 項目

在 Linux 配置 PHP 項目一, 搭建測試環境軟件環境:(PHP 項目)PHP5.4Apache(httpd2.4)mysql5.7二, 安裝1掛載:1. 把 iso 的鏡像文件放到虛擬機 Linux 的 CD/ROM(在右下角 (網絡適配器 / 橋接模式) 旁有個光盤, 點擊連接, 之后頁面出現一個光盤)2. 使用掛載命令, 把 CD/ROM 設備里…

springwebflux 頁面_【SpringBoot WEB系列】WebFlux靜態資源配置與訪問

上一篇博文介紹SpringMVC的靜態資源訪問&#xff0c;那么在WebFlux中&#xff0c;靜態資源的訪問姿勢是否一致呢I. 默認配置與SpringBoot的默認配置一樣&#xff0c;WebFlux同樣是classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/…

java中TreeSet集合如何實現元素的判重

1 /*2 看一下部分的TreeSet源碼....3 public class TreeSet<E> extends AbstractSet<E>4 implements NavigableSet<E>, Cloneable, java.io.Serializable5 {6 private transient NavigableMap<E,Object> m;7 //NavigableMap繼承SortedMap&…