思路:
很简单的一个状态压缩,比赛时没想出来。
最多只有2^10个状态,n^2暴力一下也就1e6。
代码:
#include<bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define mem(a,b) memset(a,b,sizeof(a)) const int N=1e6+5; int cnt[1024]; ll a[N]; void f(ll n) { int t=0; while(n) { t|=(1<<(n%10)); n/=10; } cnt[t]++; } int main() { ios::sync_with_stdio(false); cin.tie(0); int n; while(cin>>n) { for(int i=0;i<n;i++)cin>>a[i]; mem(cnt,0); for(int i=0;i<n;i++)f(a[i]); ll ans=0; for(int i=0;i<1024;i++) { for(int j=i;j<1024;j++) { if(i==j)ans+=(ll)cnt[i]*(cnt[i]-1)/2; else if(i&j) { ans+=(ll)cnt[i]*cnt[j]; } } } cout<<ans<<endl; } return 0; }