标签:状态 put rom attr continue 保存 个数 board sam
3
12
1
2
2
对于100%的数据,N≤1000000,每个正整数≤1018。
#include<bits/stdc++.h> typedef long long ll; using namespace std; ll tot[100005],cnt[100005]; int main() { ll n;scanf("%lld",&n); for(ll i=1;i<=n;i++){ ll x;scanf("%lld",&x); ll p=0; while(x){ ll t=x%10; x/=10; p|=(1<<t); } tot[p]++;//转换为二进制保存出现的数字 } for(ll i=0;i<(1<<10);i++){ for(ll j=0;j<(1<<10);j++){ if((j|i)==j) cnt[i]+=tot[j];//cnt[i]表示包含i状态的共有几个数 } } ll ans=0; for(ll i=1;i<(1<<10);i++){//枚举所有状态,容斥 if(cnt[i]==0) continue; ll num=0; ll x=i; while(x){ if(x&1) num++; x>>=1; } if(num&1) ans+=cnt[i]*(cnt[i]-1)/2; else ans-=cnt[i]*(cnt[i]-1)/2; } printf("%lld\n",ans); return 0; }
标签:状态 put rom attr continue 保存 个数 board sam
原文地址:https://www.cnblogs.com/lllxq/p/11670979.html