poj 2778 AC自動機 DP 矩陣快速冪

2021-06-07 13:47:54 字數 977 閱讀 2471

#include#include#include#includeusing namespace std;

typedef __int64 type;

const int kind=4; //每個節點的子節點的個數上限

const int mod = 100000;

const int size=109; //轉移矩陣的行大小

class ac_auto

ac_auto()

int index(char c)

}void insert(char *s)//構造字典樹

p=p->next[index(s[i])];

i++;

}p->key++;

}void build_fail()

if(t->next[i]->fail->key!=0) t->next[i]->key++;

q.push(t->next[i]);

}else}}

}void get_mar()}}

}void matrixmultiply(type b[size], type c[size], int sz)//矩陣乘

;for (i=0; i=mod)

temp[i][j] %= mod;}}

}for (i=0; i0)

}void solve(int n)

}printf("%i64d\n",res);

}int query(char *s)

i++;

}return sum;

}};char keyword[19],str[1000009];

int main()

x.build_fail();

x.get_mar();

x.solve(n);

}}

poj2778 ac自動機 矩陣快速冪

poj2778 求長度為m且不包含n個子串的種類數.參考自這個部落格.ac自動機 矩陣快速冪.這兒有個結論.給定乙個有向圖,問從a點恰好走k步 允許重複經過邊 到達b點的方案數mod p的值 把給定的圖轉為鄰接矩陣,即a i,j 1當且僅當存在一條邊i j。令c a a,那麼c i,j a i,k ...

poj2778 ac自動機 矩陣快速冪

給m個子串,求長度為n的不包含子串的母串數,最直接的應該是暴搜,肯定tle,考慮用ac自動機 將子串建成字典樹,通過next表來構造矩陣,然後用矩陣快速冪求長度為n的數量 鄰接矩陣 對於a i,j k 是指從i到j經過k個點的所有情況數 注意對於end陣列,如果某個節點如果fail指標end陣列為1...

poj2778(AC自動機 矩陣快速冪)

題意 給你n個字串,問你長度為m的字串且字串中不含有那n個子串的字串的數量 解題思路 這道題一開始就不太懂,還以為是組合數學的題目,後面看了別人的部落格,才知道這是屬於ac自動機的另一種用法,是關於fail陣列的運用,因為題目問的是不允許包含那n個字串,所以我們可以這麼想,假設乙個trie樹每個結點...