ac自動機與狀態轉移

2021-08-03 20:57:21 字數 1912 閱讀 7084

ac自動機是乙個確定性有限狀態自動機

形式定義

· 定義:有限狀態自動機(fa—finite automaton)是乙個五元組:

– m=(q, σ, δ, q0, f)

· 其中,

– q——狀態的非空有窮集合。∀q∈q,q稱為m的乙個狀態。

– σ——輸入字母表。

– δ——狀態轉移函式,有時又叫作狀態轉換函式或者移動函式,δ:q×σ→q,δ(q,a)=p。

– q0——m的開始狀態,也可叫作初始狀態或啟動狀態。q0∈q。

– f——m的終止狀態集合。f被q包含。任給q∈f,q稱為m的終止狀態。

首先確定性的概念,是由狀態轉移函式來區別的,如果在自動機中,由乙個狀態用同乙個狀態轉移函式可以到達不同的狀態,則這個自動機是非確定性的。即乙個狀態在得到乙個輸入後,如果只能轉移到乙個狀態,則是確定性的,如果能轉移到多個狀態,並且從這多個狀態中選擇乙個作為下乙個狀態,則是非確定的。

由於ac自動機是乙個dfa,則可以將這個dfa轉化為乙個狀態轉移表或者有向圖。所以ac自動機建立好之後,我們接下來的操作就相當於在乙個有向圖上進行操作。

對於hdu5955,我們對輸入串建好自動機,讓fail指標和轉移指標等價,就會得到乙個有向有環圖,這個圖有1個超級源點和n個匯點,圖中除了匯點以外的每個節點,都有1/6的概率轉移向另外6個節點,當我們從原點開始做無限次轉移之後,這個系統就會趨於穩定。

令每個節點為pi,表示從超級源點走到這個點的概率,則每個點的概率等於 所有轉移到它的點的概率/6 的和,以此建立方程組高斯消元可以解得答案。

令原始狀態矩陣的[0,0]位置為1,其他位置為0,計算乙個增量矩陣,對這個矩陣進行冪操作,進行足夠多次之後也可以得到答案。

#include 

#include

#define clr(x) memset(x,0,sizeof(x))

#define eps 1e-10

const

int maxsize=6;

const

int maxn=110;

int ed[maxn];

struct acautomata

void init()

void insert(int s,int len,int v)

u=ch[u][c];

}val[u]=1;

ed[v]=u;

}void getfail()

}while (!q.empty())

q.push(u);

int v=f[r];

while (v && !ch[v][c]) v=f[v];

f[u]=ch[v][c];

last[u] = val[ f[u]]? f[u]:last[f[u]];}}

}}ac;

struct gauss

void build()}}

int solve()

if(fabs(a[max_r][col])return

0; if(k!=max_r)

for(j=col+1; j<=var; j++) a[k][j]/=a[k][col];

a[k][col]=1;

for(i=0; iif(i!=k)

}for(i=0; ireturn

1; }

}ga;

int x[110];

int main()

ac.getfail();

ga.init();

ga.build();

ga.solve();

for (int i=0;iprintf("%.6lf%c",ga.x[ed[i]],i==n-1?'\n':' ');

}return

0;}

ac自動機與狀態轉移

ac自動機是乙個確定性有限狀態自動機 形式定義 定義 有限狀態自動機 fa finite automaton 是乙個五元組 m q,q0,f 其中,q 狀態的非空有窮集合。q q,q稱為m的乙個狀態。輸入字母表。狀態轉移函式,有時又叫作狀態轉換函式或者移動函式,q q,q,a p。q0 m的開始狀態...

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