P5840 [COCI2015]Divljak【AC自动机+fail树+树上乱搞】
https://www.luogu.com.cn/problem/P5840 题意:中文题,给你n个串,然后m次操作,两种操作。 1操作,集合T加入一个串。2操作,询问集合T中出现上面的n个串的第i个几次。 首先听说解法挺多的,如果有幸学会了,后来补上吧。 做法:这里用AC自动机做吧,首先对n个串建立AC自动机,建立fail树,然后每一次往T集合中加入一个字符串,就让他到AC自动机中跑,跑到的点对应到fail树上点到根上的串表示都出现了,但不过一次加入中只每个点最多只能加1,因此需要去重,同时对于同一条链上点,需要利用DFS序加LCA处理一下。统计的时候就用树状数组吧。 下面这份代码可能写丑了,不开O2勉强卡过去。 # include "bits/stdc++.h" using namespace std ; inline int read ( ) { int x = 0 ; bool f = 1 ; char c = getchar ( ) ; for ( ; ! isdigit ( c ) ; c = getchar ( ) ) if ( c == '-' ) f = 0 ; for ( ; isdigit ( c ) ; c = getchar ( ) ) x = ( x << 3 ) + ( x << 1 ) + c - '0' ; if ( f ) return x ;