題解 SDOI2009 Bill的挑戰 容斥

2021-09-29 02:23:00 字數 2055 閱讀 5581

給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不斷地收集新的貝殼,因此,他的項鍊變得越來越長。有一天,他突然提出了乙個問題 某一段貝殼中,包含了多少種不同 的貝殼?這個問題很難回答。因為項鍊實在是太長了。於是...