ac自動機演算法正確性還沒有理解,演算法導論也看不懂。。等懂了回來發演算法專題。
1 #include 2 #include 3using
namespace
std;45
const
int maxn=1e6+5;6
7intn;8
char
s[maxn];910
class
acroot, *now, *nowson, *p;
16ac(){}
17void insert(char *s, int len)
25 ++now->mark;26}
27void get_fail() //
else now->son[i]=now->fail->son[i];
//如果沒有這個子節點,意味著肯定失配
39 ++head;40}
41}42int count(char *s, int len)56}
57return
ans;58}
59private
:60 node *q[maxn], head, tail;
61};
6263
ac ac;
6465
intmain()
72ac.get_fail();
73 scanf("%s"
, s);
74 printf("
%d\n
", ac.count(s, strlen(s)));
75return0;
76 }
1 #include 2 #include 3using
namespace
std;45
const
int maxn=155, maxl1=75, maxl2=1e6+5;6
7int
n, cnt, ans[maxn];
8char
p[maxn][maxl1];
9char
t[maxl2];
1011
struct
node*mem[maxn*maxl1];
15class
ac19
void
fresh()
26void insert(char *s, int len)
35 now=now->son[v];36}
37//
如果不去重,這裡寫成等於1
38 now->id=cnt++;
39 ++now->mark;40}
41void get_fail() //
else now->son[i]=now->fail->son[i];
//如果沒有這個子節點,意味著肯定失配
53 ++head;54}
55}56void count(char *s, int len)69}
70}71private
:72 node *q[maxn*maxl1]; //
這裡忘記加了
73int
memlen;
74};
7576
ac ac;
7778
intmain()
87ac.get_fail();
88 scanf("%s"
, t);
89ac.count(t, strlen(t));
90int maxm=0;91
for (int i=0; ii)
92if (ans[i]>maxm) maxm=ans[i];
93 printf("
%d\n
", maxm);
94for (int i=0; ii)
95if (ans[i]==maxm) printf("
%s\n
", p[i]);
96 scanf("
%d", &n);
97ac.fresh();98}
99return0;
100 }
AC自動機模板
ac自動機模板 ac自動機模板 使用方法 1 init 初始化函式 2 insert str 插入字串函式 3 build 構建ac自動機 4 query str 返回出現的字串個數 使用需注意事項 1 注意輸入的字元的範圍,需對next和其二維大小及相關引數進行更改 2 注意next fail和e...
AC自動機模板
ac自動機主要是用於多模式串的匹配問題,按照我的理解,ac自動機就是在tire樹上實現kmp演算法,由於ac自動機加入了失敗指標,所以可以把他看成乙個狀態轉移的圖。給出模板 include include include include includeusing namespace std cons...
模板 AC自動機
我覺得ac自動機的難點和核心是構建失敗指標,父親的失敗指標的兒子 son2 中有和兒子 son1 相同的,即為son1的失敗指標 例 還是有個不懂的地方 第90行,跪求大佬賜教 include include include include include include include inclu...