給n
nn個字串,每個字串由a
~z
或者?
組成,其中?
可以匹配任意字元。
現在問有多少個串t
tt,滿足能夠恰好與n
nn個串中的k
kk個匹配。
n ≤20
,n \leq 20,
n≤20
,字串長度≤
50\leq 50
≤50。
這是一道容斥題,當然一看資料範圍也可以用狀壓dpdp
dp寫。考慮我們能夠預處理出什麼,資料這麼小那麼我們可以爆搜處理出t
tt至少匹配了i
ii個串的總數,記為tot
itot_i
toti。
(暴力列舉選擇情況,再來匹配)。
那麼題目要求的恰好匹配k
kk個就可以用總的減去多選的。
設a ns
ians_i
ansi
表示從n
nn個中恰好匹配i
ii個的方案,現在要求ans
j,
j<
ians_j,j < i
ansj,
j首先我們把ans
jans_j
ansj
加上tot
jtot_j
totj
。那麼現在多算了實際上一定能夠匹配i
ii個串,但只選了j
jj個串來匹配的方案。
對於能夠匹配i
ii個串的方案,我們若去掉任意i−j
i-ji−
j個串,那麼就能夠成為乙個非法的恰好只匹配j
jj個串的方案,從中去掉i−j
i-ji−
j個串有cii
−j
c_^ci
i−j
個方案。
所以有ans
j=to
tj−∑
i=j+
1n(i
i−j)
ansi
ans_j=tot_j-\sum_^(_i^)ans_i
ansj=
totj
−∑i
=j+1
n(i
i−j
)ans
i。
/*******************************
author:galaxy yr
lang:c++
created time:2023年10月27日 星期日 20時28分52秒
*******************************/
#include
#include
#include
#include
#define int long long
using
namespace std;
const
int maxn=55;
const
int mod=
1000003
;int n,k,len,stk[maxn]
,_top,num,tot,c[maxn]
[maxn]
,ans[maxn]
;string a[maxn]
;void
dfs(
int now,
int chos)}if
(ch==-1
) res=res*
26ll
%mod;
} tot=
(tot+res)
%mod;
return;}
if(chosif(n-now>=num-chos)
dfs(now+
1,chos);}
inline
void
init
(int n=50)
signed
main()
cout<<}return0;
}
SDOI2009 HH的項鍊 題解
題意 給乙個序列,長度為n,再給m個詢問,對每個詢問,輸出這個區間內有多少個不同的數。其實只需要把最後乙個出現的數統計一下就可以了,因為只有最後乙個出現的那個數才是有價值的,之前重複的數可以忽略,由此,演算法的框架就出來了,只需要有cdq的思想把查詢以區間的右端點為關鍵字排序,從前到後,同時用新出現...
SDOI2009 虔誠的墓主人
題目大意 n times m 的點陣,有的點是樹木,定義乙個空點的度數為正上,正左,正右,正下分別有 k 個點的選法 求點陣的總度數.挺好的一道題,排列組合和資料結構糅合在一塊 include include include define lowbit x x x 巨集定義樹狀陣列操作 using ...
SDOI2009 HH的項鍊 莫隊
hh有一串由各種漂亮的貝殼組成的項鍊。hh相信不同的貝殼會帶來好運,所以每次散步 完後,他都會隨意取出一段貝殼,思考它們所表達的含義。hh不斷地收集新的貝殼,因此,他的項鍊變得越來越長。有一天,他突然提出了乙個問題 某一段貝殼中,包含了多少種不同 的貝殼?這個問題很難回答。因為項鍊實在是太長了。於是...