JSOI2007 文字生成器

2022-04-30 20:33:08 字數 705 閱讀 9190

題目大意:給定乙個字串長度與乙個字串集,求存在該集合中元素作為子串的該長度字串數量

思路:ac自動機+dp+容斥(全集-不合法的)

#include"cstdio"

#include"cstring"

#include"iostream"

#include"algorithm"

using namespace std;

const int maxn=65;

const int maxm=105;

const int siz=26;

const int mod=1e4+7;

int n,m,cnt,ans;

int q[maxn*maxm];

int f[maxm][maxn*maxm];

char ch[maxm];

struct triet[maxn*maxm];

void ins(char *ch)

t[nw].vis=1;

return;

}void getfail()

}} }for(int i=0;i<=cnt;++i) ans=(ans+f[m][i])%mod;

return;

}int fpw(int a,int b)

return x;

}int main()

JSOI2007 文字生成器

用ac自動機處理所有了解的單詞 顯然,不能直接算,直接算的話,我們需要大力容斥,複雜度不允許 我們不妨反過來做,我們根據ac自動機處理出所有的不可行解,然後用總數減去即可 計算所有不可行解用dp,f i j 表示處理到字串第i位,在自動機上第j個節點的不可行方案數,直接暴力轉移即可 include ...

JSOI2007 文字生成器

容斥原理,求出所有的情況減去不可讀的情況就是可讀的文字數了a 找不可讀文字的數量類似於病毒那一題趴我覺得 dp轉移的話.用f i j 表示當前在節點j,且串長為i時的情況 include using namespace std const int mod 1e4 7 const int n 2000...

JSOI2007 文字生成器

對於乙個長度為 n 的串 s 有多少可能情況的串 s 使得 s 的子串中至少包含乙個給定的串,給定的串有 m 個 由多模式串匹配想到ac自動機,由計數想到dp 首先建好trie圖,更新所有end標記。記 dp now st flag 表示當前正在匹配第 st 位,已確定的串匹配到了trie圖上的 n...