HDU 3065 病毒侵襲持續中 ac自動機

2021-07-15 21:35:30 字數 2538 閱讀 5733

題目:

題意:problem description

小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中推測。

思路:ac自動機啊,注意當主串出現非大寫字母字元時,要回到字典樹的根重新開始匹配

#include #include #include #include #include #define debug puts("here")

using namespace std;

const int n = 1010;

struct node

}*que[n*n];

char s[n][60], str[n*n*2];

int res[n];

void _insert(char *s, node *root, int id)

p -> id = id;

}void ac_automation(node *root)

tmp = tmp -> fail;

}if(tmp == null) p -> next[i] -> fail = root;

}que[tail++] = p -> next[i];}}

}void query(char *s, node *root)

}else p = root;//回到字典樹的根重新匹配

}}void del(node *root)

int main()

ac_automation(root);

scanf("%s", str);

memset(res, 0, sizeof res);

query(str, root);

for(int i = 0; i < n; i++)

if(res[i]) printf("%s: %d\n", s[i], res[i]);

del(root);

}return 0;

}

problem description

小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中推測。

hdu 3065 病毒侵襲持續中

題目大意及思路 ac自動機。include include include include include include include include include include includeusing namespace std define inf 0x3f3f3f3f define ...

HDU 3065 病毒侵襲持續中

這就更簡單了,都不用把out標記成false了 題目中的病毒都是大寫字母這個條件應該怎麼用?include include include include include include include include include include include include include ...

HDU 3065 病毒侵襲持續中

詢問每個模式串在文字傳中出現的次數。文字串中出現的字元不一定都是大寫字母,只需要在匹配的時候,對文字串進行特殊處理,將連續的大寫字母段當成合法的乙個文字串即可。然後 就是簡單的統計了。include include include include include include using name...