題意:給你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 轉移矩陣的行大小 ...