hdu 2896 病毒侵襲 AC自動機

2022-07-31 07:21:12 字數 2175 閱讀 1187

problem description

當太陽的光輝逐漸被月亮遮蔽,世界失去了光明,大地迎來最黑暗的時刻。。。。在這樣的時刻,人們卻異常興奮——我們能在有生之年看到500年一遇的世界奇觀,那是多麼幸福的事兒啊~~

但網路上總有那麼些**,開始藉著民眾的好奇心,打著介紹日食的旗號,大肆傳播病毒。小t不幸成為受害者之一。小t如此生氣,他決定要把世界上所有帶病毒的**都找出來。當然,誰都知道這是不可能的。小t卻執意要完成這不能的任務,他說:「子子孫孫無窮匱也!」(愚公後繼有人了)。

萬事開頭難,小t收集了好多病毒的特徵碼,又收集了一批詭異**的原始碼,他想知道這些**中哪些是有病毒的,又是帶了怎樣的病毒呢?順便還想知道他到底收集了多少帶病毒的**。這時候他卻不知道何從下手了。所以想請大家幫幫忙。小t又是個急性子哦,所以解決問題越快越好哦~~

input

第一行,乙個整數n(1<=n<=500),表示病毒特徵碼的個數。

接下來n行,每行表示乙個病毒特徵碼,特徵碼字串長度在20—200之間。

每個病毒都有乙個編號,依此為1—n。

不同編號的病毒特徵碼不會相同。

在這之後一行,有乙個整數m(1<=m<=1000),表示**數。

接下來m行,每行表示乙個**原始碼,原始碼字串長度在7000—10000之間。

每個**都有乙個編號,依此為1—m。

以上字串中字元都是ascii碼可見字元(不包括回車)。

output

依次按如下格式輸出按**編號從小到大輸出,帶病毒的**編號和包含病毒編號,每行乙個含毒**資訊。

web **編號: 病毒編號 病毒編號 …

冒號後有乙個空格,病毒編號按從小到大排列,兩個病毒編號之間用乙個空格隔開,如果乙個**包含病毒,病毒數不會超過3個。

最後一行輸出統計資訊,如下格式

total: 帶病毒**數

冒號後有乙個空格。

sample input

3aaa

bbbccc

2aaabbbccc

bbaacc

sample output

web 1: 1 2 3

total: 1

題目:思路:多模式串匹配問題,ac自動機解,每個原始碼最多含有三個模式串,用陣列儲存再排序即可。因為每次匹配trie數的cnt都會變,所以可以先設定個trie陣列,用來儲存每個單詞的尾部指標

每完成一次匹配後重新設定為1即可,病毒不會重複。(這題資料太弱,不這樣做也能過o(╯□╰)o)

#include #include 

#include

#include

#include

#include

using

namespace

std;

#define max 128

intnum;

int ans[5

];typedef

struct trienode *trie;

trie c[

510]; int

cn;struct

trienode

};void insert(trie root, char *s, int

id) p = p->next[t];

}p->cnt++;

c[cn++] = p; //

另記trie的cnt;

p->id =id;

}void

getfail(trie root)

p = p->fail;

}if (p ==null)

now->next[i]->fail =root;

}q.push(now->next[i]);}}

}int ac_automation(trie root, char *s)

}returnk;}

void

recovery()

intmain()

getfail(root);

scanf(

"%d\n

", &ns);

int total = 0

;

for (int t = 1; t <= ns; t++)

recovery();

}printf(

"total: %d\n

", total);

return0;

}

hdu 2896 病毒侵襲 AC自動機

hdu 2896 題目大意 給出n個模式串,最後給出m個主串 問有主串出現過哪些模式串,最後輸出哪些主串能匹配模式串 解題思路 ac自動機建立字典樹的用w值標記第幾個模式串 定義k值,匹配時若字典樹中的某個結點不等於k且w不為0則記錄該點 有多個主串需要匹配,所以不需要改變w的值,但可以判斷k的值 ...

hdu 2896 病毒侵襲 ac自動機

include include include using namespace std define maxnode 100100 define sigma size 135 int ch maxnode sigma size int f maxnode fail函式 int val maxnode...

AC自動機 病毒侵襲 hdu2896

和hdu2222題相似的水題 1 連著re了好多發,沒想明白,看了一下網上題解才知道,輸入的不一定都是字母,所以next要開100!include include int tot char str 10005 int t int time 100 struct trie queue 100005 s...