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

2022-07-19 13:51:20 字數 1152 閱讀 9661

題意:給你n個字串,問你長度為m的字串且字串中不含有那n個子串的字串的數量

解題思路:這道題一開始就不太懂,還以為是組合數學的題目,後面看了別人的部落格,才知道這是屬於ac自動機的另一種用法,是關於fail陣列的運用,因為題目問的是不允許包含那n個字串,所以我們可以這麼想,假設乙個trie樹每個結點都有a,t,c,g這四個兒子結點,然後我們把這n個字串存進trie樹裡面,字串的結尾標記一下,然後根據fail陣列的構造,如果某個結點fail指向的結點被標記了,那麼這個結點也是不允許走的,這樣,乙個符合條件的trie樹就建立出來了,剩下的就是矩陣部分。把題目簡化成是從結點0出發到其他結點走n步的的所有允許情況;

#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

const int n=110;

struct matrix

}ans,fna;

int trie[n][4];

int fail[n],tot;

bool flag[n];

char s[15];

char c['z'+1];

int n,m;

void build_trie(char *str)//構建trie樹

while(!q.empty())

fail[trie[now][i]]=trie[fail[now]][i];

q.push(trie[now][i]);}}

}matrix mul(matrix x,matrix y)

return tmp;

}matrix matrixpow(matrix x,ll k)

return ret;

}matrix build_mat()//構建矩陣

}return temp;

}void init()

int main()

build_fail();

ans=build_mat();

fna=matrixpow(ans,n);

ll xx=0;

for(int i=0;i<=tot;i++)

printf("%lld\n",xx);

}

**:

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

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

include include include includeusing namespace std typedef int64 type const int kind 4 每個節點的子節點的個數上限 const int mod 100000 const int size 109 轉移矩陣的行大小 ...