hdu3695 AC自動機優化

2022-05-20 12:04:42 字數 1659 閱讀 1516

不加last指標的ac自動機會t,原因是他費了很多功夫在跳轉上,而last指標是直接直到跳轉的終止位置,直接跳轉到終止位置上,所以只有一次跳轉。未優化的fail指標最壞的情況下複雜度是o(|s|*|t|),其中|s|是模式串長度的均值,|t|是文字串的 長度。

**如下:

1 #include2

using

namespace

std;

3#define ll long long

4#define ull unsigned ll

5#define fi first

6#define se second

7#define lson l,m,rt<<1

8#define rson m+1,r,rt<<1|1

9#define max3(a,b,c) max(a,max(b,c))

10#define min3(a,b,c) min(a,min(b,c))

11const

int inf = 0x3f3f3f3f;12

const ll mod = 1e9+7

;13 typedef pairpll;

14const

int n = 1e6+10;15

int tot = 2;16

char str[n*26], tmp[n*26

];17

int trie[n*4][26], cnt[n*26], fair[n*26

];18

void

init()

23 tot = 2;24

}25void

insert()

34 rt =trie[rt][id];35}

36 cnt[rt]++;37}

38void

build_tree()

56else p =fair[p];57}

58if(!p) fair[trie[tmp][j]] = 1;59

}60q.push(trie[tmp][j]);61}

62}63}

64}65int find(int

len)

77else

break

;78 p =fair[p];79}

80}81 rt = 1;82

for(int i = len - 1; i >= 0; i--)

92else

break

;93 p =fair[p];94}

95}96return

ret;97}

98int

main()

109build_tree();

110 scanf("%s"

, tmp);

111int len =strlen(tmp);

112int ccc = 0

;113

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

117else

126}

127 printf("

%d\n

", find(ccc));

128}

129return0;

130 }

AC自動機 建立nlogn個AC自動機

string set queries 題意 給你3種操作,1 加入乙個串到集合中。2 刪除集合中的某乙個串 3 查詢集合中的字串在給定的字串種出現幾次。同乙個串可重複 解法 建立多個ac自動機,用二進位制分組來處理。加入給你21個串 分為 16 4 1,再新增乙個串的時候,即21 1,22 16 4...

HDU3065 AC自動機 AC感言

fourth ac zi dong ji aho corasick automation of life 9a 其實不止交了10發.感言 一開始多組資料這種小資料還是.無傷大局,因為改完以後還是wa.一 最後發現是wa在構造fail指標的時候在建立臨時指標查詢有沒有匹配到的fail,在沒有匹配到的時...

HDU3065 AC自動機 AC感言

fourth ac zi dong ji aho corasick automation of life 9a 其實不止交了10發.感言 一開始多組資料這種小資料還是.無傷大局,因為改完以後還是wa.一 最後發現是wa在構造fail指標的時候在建立臨時指標查詢有沒有匹配到的fail,在沒有匹配到的時...