HDU 2896 病毒侵襲(AC自動機入門題)

2021-08-07 05:14:58 字數 1634 閱讀 6782

題目中文題,意思很清楚。就讓後面的每個m個字串都去和n個字串匹配。

這是乙個ac自動機的模板題目。

這個題目給的字串中的字元是除回車的任意字元,所以每個節點兒子是有128個的。

我們每個字典樹的節點要維護的值有:

從root到該節點是不是乙個完整的單詞。

如果是完整的單詞,它所代表單詞的編號。

fail指標。

由於我們的ac自動機要多個文字串去跑,所以我們再加乙個vis標記以下那些文字串

已經上去匹配過了。

詳情請見**:

#include #include #include #include #include using namespace std;

const int allson = 130; ///包含所有的字元

const int maxn = 100005;

int node[maxn][allson]; ///字典樹節點

int fail[maxn]; ///fail指標

int num[maxn]; ///num[i]代表以第i個節點為結尾的單詞個數

int vis[maxn]; ///標記

int index[maxn]; ///用來存放模式串的編號

char patten[maxn]; ///模式串

char text[maxn]; ///文字串

int ans[maxn];

int id; ///用來給節點編號

int total; ///統計總共有多少個**感染病毒

///將模式串插入到字典樹,傳入的模式串的編號

void insertpatten(int identifier)

p = node[p][ch];

pos++;

}num[p]++;

index[p] = identifier; ///儲存編號

}///找fail指標,構造ac自動機

void build_ac_automaton()

else

temp = fail[temp];

}if(temp == -1)

}qu.push(node[p][i]);}}

}}///在ac自動機中進行查詢,傳入引數是第i個**的編號。

void find_in_ac_automaton(int identify)

temp = fail[temp];

}///由於乙個**病毒最多三個,所以找夠三個就出來,不要浪費時間做無用功。

if(t >= 3)

break;

pos++;

}if(t != 0)

}void init()

int main()

build_ac_automaton();

scanf("%d",&m);

for(int i = 1; i <= m; i++)

printf("total: %d\n",total);

}return 0;

}

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...