HDU2017新生赛 友好整数

思路:

很简单的一个状态压缩,比赛时没想出来。

最多只有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;
}
原文地址:https://www.cnblogs.com/widsom/p/7896064.html