求文字串t中含有單詞的數量
存模板。。
vis陣列優化
1 #include 2 #include3 #include 4
using
namespace
std;56
const
int sizech = 26;7
const
int sizenode = 5e5+10;8
const
int maxn = 1000009;9
bool
vis[sizenode];
1011
struct
ac19
void insert(char *str)
28 root =ch[root][xx];29}
30 val[root]++;31}
32void
getfail()
39while(!q.empty())
48q.push(xx);
49 fail[xx] =ch[fail[c]][i];50}
51}52}
53int find(char *str)65}
66return
cnt;67}
68}ac;
69char
str[maxn];
70int
main()
81ac.getfail();
82 scanf("%s"
, str);
83 printf("
%d\n
", ac.find(str));84}
85return0;
86 }
la 4670
有n個小寫字母組成的字串和乙個文字串,求哪些字串出現的次數最多
1//la4670 dominating patterns2//
rujia liu
3 #include 4 #include 5 #include 6 #include 7 #include
8using
namespace
std;910
const
int sigma_size = 26;11
const
int maxnode = 11000;12
const
int maxs = 150 + 10;13
14 mapms;
1516
struct
ahocorasickautomata
3031
//字元c的編號
32int idx(char
c) 35
36//
插入字串。v必須非0
37void insert(char *s, int
v) 46 u =ch[u][c];47}
48 val[u] =v;
49 ms[string(s)] =v;50}
5152
//遞迴列印以結點j結尾的所有字串
53void print(int
j) 58}59
60//
在t中找模板
61int find(char*t) 71}
7273
//計算fail函式
74void
getfail() 81}
82//
按bfs順序計算fail
83while(!q.empty()) 94}
95}9697
};98
99ahocorasickautomata ac;
100char text[1000001], p[151][80
];101
intn, t;
102103
intmain()
110ac.getfail();
111 scanf("%s"
, text);
112ac.find(text);
113int best = -1
;114
for(int i = 1; i <= n; i++)
115if(ac.cnt[i] > best) best =ac.cnt[i];
116 printf("
%d\n
", best);
117for(int i = 1; i <= n; i++)
118if(ac.cnt[ms[string(p[i])]] == best) printf("
%s\n
", p[i]);
119}
120return0;
121 }
只有不斷學次才能進步!
AC自動機 建立nlogn個AC自動機
string set queries 題意 給你3種操作,1 加入乙個串到集合中。2 刪除集合中的某乙個串 3 查詢集合中的字串在給定的字串種出現幾次。同乙個串可重複 解法 建立多個ac自動機,用二進位制分組來處理。加入給你21個串 分為 16 4 1,再新增乙個串的時候,即21 1,22 16 4...
kmp與ac自動機
xj比賽做到一道字串題,結果發現想打個字串匹配都只會n 2了,又一次忘記了kmp 想必是當初學這玩意心理陰影面積太大了。這裡再梳理一遍kmp和ac自動機 以便下次再忘了有地方看.kmp 用於處理對於字串s,想知道它在另外某個串哪些位置出現的問題,先做預處理得到乙個失配陣列,這個陣列第i位表示s的前i...
AC自動機及字尾自動機
ac自動機是一種基於trie樹的演算法,其本質和kmp上的處理很相似。trie樹結構 kmp轉移思路 ac自動機組要由三個部分組成 trie樹的建立 fail指標的匹配 對ac自動機的詢問 每次建立自動機會有一次初始化 ac自動機類 struct node node結構體 struct ac voi...