E. Vowels(SOSdp的简单转化)
傳送門
現(xiàn)在給出nnn個長度為三,由前242424個字母組成的字符串
如果一個字符串包含至少一個元音我們說這個字符串是正確的
現(xiàn)在讓你規(guī)定每個字母是否是元音
對于元音的2242^{24}224種組合,計(jì)算所有組合[ 正確單詞平方 ]的異或和
把nnn個字符串壓縮成242424位的二進(jìn)制數(shù)字,把元音的組合也這樣壓縮
那么預(yù)處理一個axa_xax?表示二進(jìn)制為xxx的字符有axa_xax?個
當(dāng)元音組合的二進(jìn)制是maskmaskmask時,需要知道所有與maskmaskmask有交集的xxx的f[mask]=∑axf[mask]=\sum a_xf[mask]=∑ax?
這樣答案就是f[0]2⊕f[1]2.......f[0]^2\oplus f[1]^2.......f[0]2⊕f[1]2.......
但是我們處理不出這樣的fff數(shù)組…
但是使用SOSDPSOSDPSOSDP可以快速處理f[mask]f[mask]f[mask]表示所有maskmaskmask子集的∑ax\sum a_x∑ax?
那么和maskmaskmask沒有交集的數(shù)目就是:f[~mask]f[\sim mask]f[~mask]
那么n?f[~mask]n-f[\sim mask]n?f[~mask]就是和maskmaskmask有交集的數(shù)目
經(jīng)過這個奇妙的轉(zhuǎn)化,只需要用sosdpsosdpsosdp的模板即可快速得解
然后還有另一種理解思路,就是先求所有不正確的字符串個數(shù)
我們令maskmaskmask為非元音字母的狀態(tài)
也就是求f[mask]f[mask]f[mask]表示所有是maskmaskmask子集的∑ax\sum a_x∑ax?
那么這些f[mask]f[mask]f[mask]都是不正確的,因?yàn)槎急环窃舭?/p>
拿nnn減去即可別人寫的博客
然后還有一種容斥的做法別問我為什么那么多做法你一個都不知道
正確單詞=包含一個元音的個數(shù)-包含兩個元音的個數(shù)+包含三個元音的個數(shù)
那么枚舉每個單詞的非空子集,根據(jù)子集中111個數(shù)的奇偶來給fff數(shù)組加或者減
這樣作為初始化,做一遍sosdpsosdpsosdp即可,別人寫的博客
下面是我寫的,第一種做法的代碼
#include <bits/stdc++.h> using namespace std; const int mx = 1<<24; int f[mx],n; int main() {scanf("%d",&n); getchar();for(int i=1;i<=n;i++){int temp = 0;for(int j=1;j<=3;j++){char w; scanf("%c",&w);temp |= (1<<(w-'a'));} getchar();f[temp]++;}for(int i=0;i<24;i++)for(int j=mx-1;j>=0;j--)if( j&(1<<i) ) f[j] += f[j^(1<<i)];//所有是j子集的和 int ans = 0;for(int i=0;i<mx;i++)ans ^= (n-f[(mx-1)^i])*(n-f[(mx-1)^i]);cout << ans; }總結(jié)
以上是生活随笔為你收集整理的E. Vowels(SOSdp的简单转化)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: paddlehub 使用体验-视频抠图_
- 下一篇: mysql的concat函数_MySQL