牛數 ac自動機 數字dp

2021-10-22 00:25:45 字數 781 閱讀 6756

給你n個數字串,定義牛數x:n個數字串都不是x的子串。然後給你乙個長度為2000的數字s,問你[1, s]之間牛數有多少個。

多個模式串匹配主串,就自然而然地會想到ac自動機了,然後問你[1,s]之間滿足條件的數的個數,那麼就是數字dp了,不過這裡的數字dp要在trie樹上跑,還要注意判斷前導零。

#includeusing namespace std;

#define io cin.tie(0);ios::sync_with_stdio(false);

#define debug(x) cout<<#x<<"="for(int i = 0; i < 10; i ++)

}while(q.size())else}}

}//數字dp部分

int len; //主串長度

char s[maxn]; //主串

ll dp[2005][2005][2][2];

ll dfs(int pos, int now, bool limit, bool pre)

if(!limit) dp[pos][now][limit][pre] = ans; //記憶化

return ans;

}void solve()

getfail();

memset(dp, -1, sizeof(dp));

cout << (dfs(1, 0, 1, 1) - 1 + mod) % mod << endl; //求的是[1, s],dfs多了0,所以要減去1

}int main()

ZOJ 3494 AC自動機 數字DP

有一種bcd編碼方案,求a到b範圍內的數字的bcd編碼有多少個不包含不能包含的字串。數字範圍這麼大,很明顯就能看出來是數字dp。基於ac自動機的數字dp使得數字dp容易了不少,因為ac自動機自帶狀態轉移。在數字dp選取每一位的時候,基於ac自動機狀態轉移一下,如果轉移到不能轉移的狀態,就直接返回 1...

zoj3494 ac自動機 數字dp

題解 把給的串建ac自動機,然後得到的bcd i j bcd i j 表示在ac自動機上的狀態i,後面加入j會轉移的狀態,1表示不能加 然後數字dp,dp i j 表示取到第i位狀態為j後面的數字隨便取的方案數,這裡是記憶化。include include include include inclu...

牛客 牛妹的考驗 AC自動機 dp

題目大意 給出 n 個模式串每個模式串都有乙個價值,要求構造出乙個長度為 m 的字串,每個模式串出現一次都會得到一次相應的價值,問如何構造可以使得最終的價值總和最大 題目分析 做過一道加強版的題目 多餘的功能刪掉就好,有個不太一樣的細節就是,上面的那個題目的字串不允許共用,但這個題目的字串允許共用,...