一組單詞是安全的,當且僅當不存在乙個單詞是另乙個單詞的字首,這樣才能保證資料不容易被誤解。現在你手上有乙個單詞集合,你需要計算有多少個子集是安全的。
注意空集永遠是安全的。
首先:設dp[i]表示前i個集合以i結尾的集合數
核心**:dp[i] = dp[j](1<=j但是問題在於與j不互為字首的單詞不一定與i不互為字首,這裡直接從小到大排序就可以解決。
為什麼呢?
證畢。補充:這裡排序後的n個數沒有變,求解空間是一樣的。若不排序,則答案一定會偏大(有些決策會被計算,實際並不符合),而不會偏小
膜拜:出題人c20210826
**如下:
#include
#include
#include
using
namespace std;
string s[55]
;int n , f[55]
[55];
long
long dp[55]
;//2^50次方在longlong以內
intcompare
(int x ,
int y)
return0;
}int
main()
題解 P1666 字首單詞
考慮到沒有相同的字串,不難發現這是乙個樹形dp,在字典樹上,一旦某個節點被選中,其子樹中的任何節點都不能被選中。如果使用字串比較建圖的話,需要注意去除多重的邊。include include include include includeusing namespace std typedef uns...
字首單詞 好題
題目描述 一組單詞是安全的,當且僅當不存在乙個單詞是另乙個單詞的字首,這樣才能保證資料不容易被誤解。現在你手上有乙個單詞集合,你需要計算有多少個子集是安全的。注意空集永遠是安全的。輸入格式 第一行乙個數 表示集合的大小,以下n行。每行乙個由 構成的字串。輸出格式 安全子集的個數。樣例輸入 1 3he...
單詞檢索 題解
呃 這題,真的不想說話。給出n個由小寫字母組成的字串,統計至少在m個字串中出現過的長度為l的字串數 n,m 2000,l i,l 1000 n m 2000,l i,l 1000 一看,就知道是雜湊 對於每個長度為l的串,都雜湊一下 還要記得o 1 o 1 推下乙個雜湊值,對於同乙個模板中出現多次的...