test20181019 B君的第二题

题意


分析

快速子集和变换以及快速超集和变换的裸题。

\(f(s)\)表示集合s的方案数,初始化为输入中s出现的次数。

  1. 做一遍快速子集和变换,此时f(s)表示s及其子集在输入中出现的次数。
  2. 对所有f(s)所表示的数两两组合,此时f(s)表示生成s及其子集的方案数。
  3. 做一遍快速子集差变换,此时f(s)表示生成s的方案数。
  4. 做一遍快速超集和变换,此时f(s)表示生成s及其超集的方案数。

时间复杂度\(O(n \cdot k)\)

浅谈FST

感觉就是对每一个二进制位纵向更新,这样就不会算重,时间复杂度\(O(s \cdot 2^s)\)

代码

#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<string>
#include<vector>
#include<list>
#include<deque>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<bitset>
#include<algorithm>
#include<complex>
#define rg register
#define il inline
#define co const
#pragma GCC optimize ("O0")
using namespace std;
template<class T> il T read()
{
    rg T data=0;
    rg int w=1;
    rg char ch=getchar();
    while(!isdigit(ch))
    {
        if(ch=='-')
            w=-1;
        ch=getchar();
    }
    while(isdigit(ch))
        data=10*data+ch-'0',ch=getchar();
    return data*w;
}
template<class T> il T read(rg T&x)
{
    return x=read<T>();
}
typedef long long ll;
const int INF=0x7fffffff;

const int MAXN=1<<20|7;
ll f[MAXN];

int main()
{
  freopen("lhasa.in","r",stdin);
  freopen("lhasa.out","w",stdout);
    rg int n,k;
    read(n);read(k);
    for(rg int i=1;i<=n;++i)
    {
        ++f[read<int>()];
    }
    for(rg int i=0;i<k;++i) // 逐位递推 
        for(rg int j=0;j<1<<k;++j)
            if(j >> i & 1)
            {
                f[j] += f[j ^ (1 << i)];
            }
    for(rg int i=0;i<1<<k;++i) // 组合 
    {
        f[i]=f[i]*(f[i]-1)/2;
    }
    for(rg int i=0;i<k;++i) // 减去组合成自己的组合 
        for(rg int j=0;j<1<<k;++j)
            if(j >> i & 1)
            {
                f[j] -= f[j ^ (1 << i)];
            }
    for(rg int i=0;i<k;++i) // 加上超集的方案数 
        for(rg int j=0;j<1<<k;++j)
            if(j >> i & 1)
            {
                f[j ^ (1 << i)] += f[j];
            }
    for(rg int i=0;i<1<<k;++i)
    {
        printf("%lld\n",f[i]);
    }
//  fclose(stdin);
//  fclose(stdout);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/autoint/p/9818216.html