TOJ4483 Common Digit Pairs(状压)
题意:
给定N个互不相同且均不超过 1 0 18 10^{18} 1018整数, 输出能组成多少对能有相同数字的整数对。例如,给定三个整数1,11,21,结果为三:<1,11>, <1,21>, <11, 21>。( 1 ≤ N ≤ 1000000 1 \leq N \leq 1000000 1≤N≤1000000)
思路:
将每个数的数字去重后状压成二进制数
Code:
映射数组
for(int i = 1; i < 10; i++){
a[i] = a[i - 1] * 2;
}
二进制转换:
cin >> n;
for(int i = 1; i <= n; i++){
string s;
cin >> s;
bool b[10] = {0};
for(auto c : s){
b[c - '0'] = 1;
}
int e = 0;
for(int j = 0; j < 10; j++){
if(b[j]){
e += a[j];
}
}
ss[e] ++;
}
枚举 + 组合:
int ans = 0;
// diffierent ans positive !!!
for(int i = 1; i < 1024; i++){
ans += ss[i] * (ss[i] - 1) / 2;
for(int j = 1; j < i; j++){
if(i & j){
ans += ss[i] * ss[j];
}
}
}
cout << ans << endl;