題目
給n個字母,構成長度為m的串,總共有n^m種。給p個字串,問n^m種字串中不包含(不是子串)這p個字串的個數。總之感覺是好東西,快存下來將p個不能包含的字串建立ac自動機,每個結點用val值來標記以當前節點為字尾的字串是否包含非法字串(p個字串中的任何乙個)。
狀態轉移方程:f(i, j) += f(i-1, k)
f(i, j)表示長度為i的字串,結尾為字元j,方程j和k的關係可以從自動機中失配關係直接獲得(j是k的後繼結點)。
大數模版:
#include #includeview code#include
using
namespace
std;
struct
biginteger;
biginteger()
void
set(int x)
void
print()
for (int k=10; k*a[i]10) printf("0"
); printf("%d
", a[i]);
}printf("\n
");}
int& operator (int p)
const
int& operator (int p) const
biginteger
operator + (const biginteger&b)
biginteger
operator * (const biginteger&b)
if (c[c[0]] == 0) c[0]--;
return
c; }
};int
main()
本題答案(內含ac自動機模版):
#include #includeview code#include
#include
#include
#include
using
namespace
std;
typedef unsigned
char
uchar;
struct
ac_automata
int hash[256
], m;
void set_hash(int
n, uchar s)
void insert(uchar s, int
v) u =ch[u][c];
}val[u] = v; //
標記當前串為非法的
}
void
build()
}while (!q.empty())
q.push(u);
f[u] =ch[f[r]][c];
last[u] = val[f[u]] ?f[u] : last[f[u]];}}
}} ac;
struct
biginteger;
biginteger()
void
set(int x)
void
print()
for (int k=10; k*a[i]10) printf("0"
); printf("%d
", a[i]);
}printf("\n
");}
int& operator (int p)
const
int& operator (int p) const
biginteger
operator + (const biginteger&b)
biginteger
operator * (const biginteger&b)
if (c[c[0]] == 0) c[0]--;
return
c; }
};int
n, m, p;
uchar s[
55];
intmain()
ac.build();
biginteger f[
51][101
]; f[
0][0].set(1
);
for (int i=1; i<=m; i++)
for (int j=0; j)
for (int k=0; k)
biginteger ans;
for (int i=0; i)
if (!ac.val[i]) ans = ans +f[m][i];
ans.print();
}return0;
}
POJ1625 AC自動機 DP 大數
題解 跑一遍ac自動機,後直接在上面dp一維表示字元長度二維表示處於那個結點最後標記一下那些位置是危險結點不要轉移過去即可,由於這題資料很大又沒有取膜所以要用大數相加 include include include include includeusing namespace std const i...
poj 1625 AC自動機 動歸 大數加法
題意 給出乙個字符集v和p個模式串 長度小於10 問由這個字符集中字元組成的長度為n的且不包含任意乙個模式串的字串有多少個?字符集大小,n 50,p 10 思路 先將p個模式串建立ac自動機,標記好危險節點 flag陣列 然後動歸來求 dp i j 表示長度為i且最後在節點j的字串個數 節點j必為安...
ac自動機模版
字尾陣列 include include include using namespace std const int maxn 200000 100 int wa maxn wb maxn wv maxn ws maxn int rank maxn height maxn int sa maxn r...