ac自動機倆模板

2022-05-06 16:33:13 字數 2157 閱讀 9822

ac自動機演算法正確性還沒有理解,演算法導論也看不懂。。等懂了回來發演算法專題。

1 #include 2 #include 3

using

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 3

using

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...