模板 AC自動機

2021-08-11 12:39:01 字數 2074 閱讀 6081

先貼乙個大白書的**

來自這篇blog

//hdu2222

#include

#include

#include

#include

#include

using

namespace

std;

const

int n=500500;

struct acautomachine

void insert(char* p)//構建trie

cur=chd[cur][*p-'a'];

} cnt[cur]++;

} bool query(char* p)//題目需要

return cnt[cur]&&(!(*p));

} int getfail()

} while(!q.empty())

q.push(u);

int v=fail[r];

while(v&&!chd[v][c]) v=fail[v];

//1. 令指標為 fail[fa[u]]

//2. 若指標的一級兒子中存在一點(代表字元)與 u 相同

// 則令fail[u] 指向 當前指標的該兒子

//3. 否則 指標指向 fail[指標] 並重複 2 操作、

//目的:使得當前點及其到根的路徑(即乙個字典串) 與 fail 和fail[fail]... 所代表字典串 字尾相同

// 從而實現重新匹配

fail[u]=chd[v][c];

last[u]=cnt[fail[u]] ? fail[u] : last[fail[u]];

} }

} void solve(int j) //題目需要

solve(last[j]);

} void find(char* t) //題目需要

} }ac;

int main()

scanf("%s",str);

ac.find(str);

printf("%d\n",ac.ans);

} return

0;

}

自己的

剛開始一點也不注意常數

tle了好久啊[淚]

#include 

#include

#include

#include

#include

#include

#define fo(i,x,y) for (int i=(x);i<=(y);++i)

#define fd(i,x,y) for (int i=(x);i>=(y);--i)

#define oo 2139062143

using

namespace

std;

typedef

long

long ll;

typedef

double db;

const

int n=501000,c=27;

int t,n;

int ans;

char dic[55],str[1100000];

struct acautomation

void init()

void insert(char *p)

tmp=chd[tmp][now];

}++ot[tmp];

}void getfail()

}while(hd++0,25)

if(chd[tmp][i])}}

void solve(char *p)

} }}

}ac;

int main()

ac.getfail();

ans=0;

scanf("%s\n",str+1);

ac.solve(str);

printf("%d\n",ans);

}return

0;}

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