string set queries
題意:給你3種操作,1、加入乙個串到集合中。 2、刪除集合中的某乙個串 3、查詢集合中的字串在給定的字串種出現幾次。(同乙個串可重複)
解法:建立多個ac自動機,用二進位制分組來處理。
加入給你21個串: 分為 16+4+1,再新增乙個串的時候,即21+1, 22 = 16+4+1+1 = 16 + 4 + 2。 這樣每次加串之後只會有logn個操作,查詢也變成logn操作, 對於同乙個串建立fair指標的次數就少了。
**:
1 #include2ac自動機using
namespace
std;
3#define fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout);
4#define ll long long
5#define ull unsigned ll
6#define fi first
7#define se second
8#define pb push_back
9#define lson l,m,rt<<1
10#define rson m+1,r,rt<<1|1
11#define max3(a,b,c) max(a,max(b,c))
12#define min3(a,b,c) min(a,min(b,c))
13 typedef pairpll;
14const
int inf = 0x3f3f3f3f;15
const ll mod = (int)1e9+7;16
const
int n = 3e5 + 100;17
struct
node35}
36}37void add(char s, char
ch)44 mark[pos]++;
45while(si[cnt] == si[cnt-1
])49
build(root[cnt]);50}
51int query(char s, char
ch)61}62
return
ret;63}
64void unit(int u, int
v)70
}71 }ac[2
];72
char
str[n];
73int
main()83}
84return0;
85 }
AC自動機演算法
ac自動機簡介 首先簡要介紹一下ac自動機 aho corasickautomation,該演算法在1975年產生於貝爾實驗室,是著名的多模匹配演算法之一。乙個常見的例子就是給出n個單詞,再給出一段包含m個字元的文章,讓你找出有多少個單詞在文章裡出現過。要搞懂ac自動機,先得有字典樹trie和kmp...
AC自動機演算法
ac自動機簡介 首先簡要介紹一下ac自動機 aho corasick automation,該演算法在1975年產生於貝爾實驗室,是著名的多模匹配演算法之一。乙個常見的例子就是給出n個單詞,再給出一段包含m個字元的文章,讓你找出有多少個單詞在文章裡出現過。要搞懂ac自動機,先得有字典樹trie和km...
ac自動機系列
求長度不超過l的串中,包含一些單詞的串的個數 首先構造自動機,然後把每個包含了終結態的狀態都置為終結態,比如abc b,那麼ab,abc,b都是終結態,然後構造矩陣a,ax就是長度為一時得到的結果a n為長度為n結果 其中x 0,1,0 第乙個表示終結狀態,第二個表示起始狀態,最後乙個表示為長度小於...