日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

E. Vowels(SOSdp的简单转化)

發(fā)布時(shí)間:2023/12/9 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 E. Vowels(SOSdp的简单转化) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

傳送門

現(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時(shí),需要知道所有與maskmaskmask有交集的xxxf[mask]=∑axf[mask]=\sum a_xf[mask]=ax?

這樣答案就是f[0]2⊕f[1]2.......f[0]^2\oplus f[1]^2.......f[0]2f[1]2.......

但是我們處理不出這樣的fff數(shù)組…

但是使用SOSDPSOSDPSOSDP可以快速處理f[mask]f[mask]f[mask]表示所有maskmaskmask子集的∑ax\sum a_xax?

那么和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_xax?

那么這些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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。