[CF383E] Vowels 题解 SOS dp

题目

题意 : 给定 n n n a a a x x x 3 3 3 位字符串 , 我们定义一个包含至少一个元音字母的字符串是正确的. 已知元音字母是 a a a x x x 中的若干个 ( 有 2 24 2^{24} 224 种情况 ) , 问在所有情况下正确字符串个数平方的异或和

考虑字符串 s s s 不是正确的情况 , 此时 s s s 一定不包含任意元音字母 , 因此一定是非元音字母集合的一个子集 , 我们对非元音集合做一个 SOS dp , 得到在非元音集合 s t a t e state state 下不正确的个数 f [ s t a t e ] f[state] f[state] , 正确的个数即为 ( n − f [ s t a t e ] ) (n-f[state]) (nf[state])

#include
#define int long long
using namespace std;
const int MAXN = 1e4+5;
int n, ans, f[1<<24];
signed main()
{
    cin >> n;
    for(int i=1; i<=n; i++)
    {
        string s; cin >> s;
        int x = 1<<(s[0]-'a') | 1<<(s[1]-'a') | 1<<(s[2]-'a');
        f[x]++;
    }
    for(int i=0; i<24; i++)
    {
        for(int S=0; S<(1<<24); S++)
        {
            if(S & 1<<i) f[S] += f[S^1<<i];
        }
    }
    for(int S=0; S<(1<<24); S++) 
		ans ^= (n-f[S]) * (n-f[S]);
    cout << ans;
    return 0;
}

你可能感兴趣的:(题解,动态规划,算法)