題解:跑一遍ac自動機,後直接在上面dp一維表示字元長度二維表示處於那個結點最後標記一下那些位置是危險結點不要轉移過去即可,由於這題資料很大又沒有取膜所以要用大數相加
#include#include#include#include#includeusing namespace std;
const int mod = 1e8;
struct node
len = max(len,x.len);
if(p)
a[++len] = p;
}void print()
};int n,m,p;
struct tried
void idx(char *s)
void insert(char *s)
u = ch[u][d];
}v[u] = 1;
}void getfail()
int ret = ch[u][d];
f[ret] = ch[f[u]][d];
q.push(ret);}}
}void work()
node ans;
memset(ans.a,0,sizeof(ans.a));
ans.len = 0;
for(int j = 0; j < sz; j++)
ans += dp[m][j];
ans.print();
}}word;
char s[105];
int main()
word.getfail();
word.work();
}}
poj 1625 AC自動機 動歸 大數加法
題意 給出乙個字符集v和p個模式串 長度小於10 問由這個字符集中字元組成的長度為n的且不包含任意乙個模式串的字串有多少個?字符集大小,n 50,p 10 思路 先將p個模式串建立ac自動機,標記好危險節點 flag陣列 然後動歸來求 dp i j 表示長度為i且最後在節點j的字串個數 節點j必為安...
poj 1625 dp 大數 ac自動機
題意 在乙個國家當中,給你乙個詞彙書,你可以用裡面所有的字母拼湊出乙個單詞來,但是在這個國家當中存在一些禁用的單詞,那麼現在問你在不違反規則的情況下,你能盡可能的多拼湊出相應的單詞來。那麼也就是說拼湊的單詞當中不能夠出現禁用的單詞的字段。後面看到網上教程當中的dp狀態轉移,傻眼了。這都可以。dp i...
poj 1625 (AC自動機好模版,大數好模版)
題目 給n個字母,構成長度為m的串,總共有n m種。給p個字串,問n m種字串中不包含 不是子串 這p個字串的個數。將p個不能包含的字串建立ac自動機,每個結點用val值來標記以當前節點為字尾的字串是否包含非法字串 p個字串中的任何乙個 狀態轉移方程 f i,j f i 1,k f i,j 表示長度...