小t非常感謝大家幫忙解決了他的上乙個問題。然而病毒侵襲持續中。在小t的不懈努力下,他發現了網路中的「萬惡之源」。這是乙個龐大的病毒**,他有著好多好多的病毒,但是這個**包含的病毒很奇怪,這些病毒的特徵碼很短,而且只包含「英文大寫字元」。當然小t好想好想為民除害,但是小t從來不打沒有準備的戰爭。知己知彼,百戰不殆,小t首先要做的是知道這個病毒**特徵:包含多少不同的病毒,每種病毒出現了多少次。大家能再幫幫他嗎?
input
第一行,乙個整數n(1<=n<=1000),表示病毒特徵碼的個數。
接下來n行,每行表示乙個病毒特徵碼,特徵碼字串長度在1—50之間,並且只包含「英文大寫字元」。任意兩個病毒特徵碼,不會完全相同。
在這之後一行,表示「萬惡之源」**原始碼,原始碼字串長度在2000000之內。字串中字元都是ascii碼可見字元(不包括回車)。
output
按以下格式每行乙個,輸出每個病毒出現次數。未出現的病毒不需要輸出。
病毒特徵碼: 出現次數
冒號後有乙個空格,按病毒特徵碼的輸入順序進行輸出。
sample input
3sample outputaabb
ccooxxcc%daaaoen....end
aa: 2hintcc: 1
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樹時,字串的資訊 病毒編號 存放在最後乙個字母的 ...