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