病毒侵襲持續中(AC自動機)

2021-09-26 07:53:58 字數 1236 閱讀 2650

小t非常感謝大家幫忙解決了他的上乙個問題。然而病毒侵襲持續中。在小t的不懈努力下,他發現了網路中的「萬惡之源」。這是乙個龐大的病毒**,他有著好多好多的病毒,但是這個**包含的病毒很奇怪,這些病毒的特徵碼很短,而且只包含「英文大寫字元」。當然小t好想好想為民除害,但是小t從來不打沒有準備的戰爭。知己知彼,百戰不殆,小t首先要做的是知道這個病毒**特徵:包含多少不同的病毒,每種病毒出現了多少次。大家能再幫幫他嗎?

input

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

接下來n行,每行表示乙個病毒特徵碼,特徵碼字串長度在1—50之間,並且只包含「英文大寫字元」。任意兩個病毒特徵碼,不會完全相同。 

在這之後一行,表示「萬惡之源」**原始碼,原始碼字串長度在2000000之內。字串中字元都是ascii碼可見字元(不包括回車)。 

output

按以下格式每行乙個,輸出每個病毒出現次數。未出現的病毒不需要輸出。 

病毒特徵碼: 出現次數 

冒號後有乙個空格,按病毒特徵碼的輸入順序進行輸出。 

sample input

3

aabb

ccooxxcc%daaaoen....end

sample output

aa: 2

cc: 1

hint

hit:

題目描述中沒有被提及的所有情況都應該進行考慮。比如兩個病毒特徵碼可能有相互包含或者有重疊的特徵碼段。

計數策略也可一定程度上從sample中推測。

#includeusing namespace std;

typedef long long ll;

const int maxn=5e4+10;

const int n=2e6+10;

const int maxc=26;

char s[n];

char str[n];

char bd[1005][55];

int ans[1005];

struct trie

tot=1;

} void add(char s,int id)

} while(!q.empty())}}

} void find(char s)

} if(cnt)

for(int i=1;i<=n;i++) }

return 0;

}

病毒侵襲持續中 AC自動機

傳送門 這裡闡述一下fail陣列的定義 對於 x 與 fail x 兩個點 fail x 到根的字串與從x往上相同字元的字串相同 可以說 fail x 到根的字串是x到根的字串的字尾 所以如果我們發現匹配傳可以匹配到x 那麼fail x fail fail x 都是可以匹配的 另外 如果我們匹配到了...

AC自動機(病毒侵襲 )

題目大意 中文題目 具體思路 ac自動機模板題,編號的時候注意,是按照給定的id進行編號的。然後輸出的時候注意去重,雖然按道理來講通過last陣列是不會有重複的,但是如果是這種情況,病毒模板aaa,然後給你乙個模板串aaaaa,這樣的話,就肯定會有重複的了,所以需要去重,其次輸出的時候按照公升序輸出...

暑假 ac自動機 C 病毒侵襲持續中

明明題目沒有說多組資料,然後我就當作一組資料來做了。看來看去 都沒有錯,但是一提交就wa,害我該了乙個下午。天啊!去找題解才知道是多組資料。不要被省略 有多組資料 而欺騙了。題意 中文題,詳見hdu 3065 思路 套ac自動機模板。注意 建trie樹時,字串的資訊 病毒編號 存放在最後乙個字母的 ...