poj 1625 (AC自動機好模版,大數好模版)

2022-08-20 01:27:08 字數 2469 閱讀 1879

題目

給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 #include 

#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()

view code

本題答案(內含ac自動機模版):

#include #include 

#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;

}

view code

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