#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define str string
#define fi first
#define se second
#define pll pair<ll, ll>
#define pii pair<int, int>
#define pb push_back
#define all(x) x.begin(), x.end()
const ll N = 1e5+5, INF = INT_MAX, MOD = 1e9 + 7;
const ll INFL = LLONG_MAX;
int d14(int n, int d, vector <str> &s) {
map <str, int> cnt;
int ans = 0;
for(int i = 0; i < n; i ++) {
for(int mask = 0; mask < (1 << 4); mask ++) {
if(__builtin_popcount(mask) > d) continue;
str s2 = s[i];
for(int j = 0; j < 4; j ++) {
if((mask >> j) & 1) s2[j] = 'X';
}
if(__builtin_popcount(mask) % 2 == d % 2) {
ans += cnt[s2];
}
else{
ans -= cnt[s2];
}
}
for(int mask = 0; mask < (1 << 4); mask ++) {
str s2 = s[i];
for(int j = 0; j < 4; j ++) {
if((mask >> j) & 1) s2[j] = 'X';
}
cnt[s2] ++;
}
}
return ans;
}
ll da(char &a, char &b, char &c, char &d) {
ll add = 1;
ll sum = 0;
if('0' <= a && a <= '9') {
sum += add * (a - '0');
}
else{
sum += add * (a - 'a' + 11);
}
add *= 26;
if('0' <= b && b <= '9') {
sum += add * (b - '0');
}
else{
sum += add * (b - 'a' + 11);
}
add *= 26;
if('0' <= c && c <= '9') {
sum += add * (c - '0');
}
else{
sum += add * (c - 'a' + 11);
}
add *= 26;
if('0' <= d && d <= '9') {
sum += add * (d - '0');
}
else{
sum += add * (d - 'a' + 11);
}
return sum;
}
int d2(int n, int d, vector <str> &s) {
int cnt[int(1e6)];
memset(cnt, 0, sizeof(cnt));
int ans = 0;
for(int i = 0; i < n; i ++) {
ans += cnt[da(s[i][0], s[i][1], s[i][2], s[i][3])];
for(char j = '0'; j <= '9'; j ++) {
for(char k = '0'; k <= '9'; k ++ ) {
if(s[i][0] == j || s[i][1] == k) continue;
cnt[da(j, k, s[i][2], s[i][3])] ++;
}
for(char k = 'a'; k <= 'z'; k ++ ) {
if(s[i][0] == j || s[i][1] == k) continue;
cnt[da(j, k, s[i][2], s[i][3])] ++;
}
}
for(char j = 'a'; j <= 'z'; j ++) {
for(char k = '0'; k <= '9'; k ++ ) {
if(s[i][0] == j || s[i][1] == k) continue;
cnt[da(j, k, s[i][2], s[i][3])] ++;
}
for(char k = 'a'; k <= 'z'; k ++ ) {
if(s[i][0] == j || s[i][1] == k) continue;
cnt[da(j, k, s[i][2], s[i][3])] ++;
}
}
for(char j = '0'; j <= '9'; j ++) {
for(char k = '0'; k <= '9'; k ++ ) {
if(s[i][0] == j || s[i][2] == k) continue;
cnt[da(j, s[i][1], k, s[i][3])] ++;
}
for(char k = 'a'; k <= 'z'; k ++ ) {
if(s[i][0] == j || s[i][2] == k) continue;
cnt[da(j, s[i][1], k, s[i][3])] ++;
}
}
for(char j = 'a'; j <= 'z'; j ++) {
for(char k = '0'; k <= '9'; k ++ ) {
if(s[i][0] == j || s[i][2] == k) continue;
cnt[da(j, s[i][1], k, s[i][3])] ++;
}
for(char k = 'a'; k <= 'z'; k ++ ) {
if(s[i][0] == j || s[i][2] == k) continue;
cnt[da(j, s[i][1], k, s[i][3])] ++;
}
}
for(char j = '0'; j <= '9'; j ++) {
for(char k = '0'; k <= '9'; k ++ ) {
if(s[i][0] == j || s[i][3] == k) continue;
cnt[da(j, s[i][1], s[i][2], k)] ++;
}
for(char k = 'a'; k <= 'z'; k ++ ) {
if(s[i][0] == j || s[i][3] == k) continue;
cnt[da(j, s[i][1], s[i][2], k)] ++;
}
}
for(char j = 'a'; j <= 'z'; j ++) {
for(char k = '0'; k <= '9'; k ++ ) {
if(s[i][0] == j || s[i][3] == k) continue;
cnt[da(j, s[i][1], s[i][2], k)] ++;
}
for(char k = 'a'; k <= 'z'; k ++ ) {
if(s[i][0] == j || s[i][3] == k) continue;
cnt[da(j, s[i][1], s[i][2], k)] ++;
}
}
for(char j = '0'; j <= '9'; j ++) {
for(char k = '0'; k <= '9'; k ++ ) {
if(s[i][1] == j || s[i][2] == k) continue;
cnt[da(s[i][0], j, k, s[i][3])] ++;
}
for(char k = 'a'; k <= 'z'; k ++ ) {
if(s[i][1] == j || s[i][2] == k) continue;
cnt[da(s[i][0], j, k, s[i][3])] ++;
}
}
for(char j = 'a'; j <= 'z'; j ++) {
for(char k = '0'; k <= '9'; k ++ ) {
if(s[i][1] == j || s[i][2] == k) continue;
cnt[da(s[i][0], j, k, s[i][3])] ++;
}
for(char k = 'a'; k <= 'z'; k ++ ) {
if(s[i][1] == j || s[i][2] == k) continue;
cnt[da(s[i][0], j, k, s[i][3])] ++;
}
}
for(char j = '0'; j <= '9'; j ++) {
for(char k = '0'; k <= '9'; k ++ ) {
if(s[i][1] == j || s[i][3] == k) continue;
cnt[da(s[i][0], j, s[i][2], k)] ++;
}
for(char k = 'a'; k <= 'z'; k ++ ) {
if(s[i][1] == j || s[i][3] == k) continue;
cnt[da(s[i][0], j, s[i][2], k)] ++;
}
}
for(char j = 'a'; j <= 'z'; j ++) {
for(char k = '0'; k <= '9'; k ++ ) {
if(s[i][1] == j || s[i][3] == k) continue;
cnt[da(s[i][0], j, s[i][2], k)] ++;
}
for(char k = 'a'; k <= 'z'; k ++ ) {
if(s[i][1] == j || s[i][3] == k) continue;
cnt[da(s[i][0], j, s[i][2], k)] ++;
}
}
for(char j = '0'; j <= '9'; j ++) {
for(char k = '0'; k <= '9'; k ++ ) {
if(s[i][2] == j || s[i][3] == k) continue;
cnt[da(s[i][0], s[i][1], j, k)] ++;
}
for(char k = 'a'; k <= 'z'; k ++ ) {
if(s[i][2] == j || s[i][3] == k) continue;
cnt[da(s[i][0], s[i][1], j, k)] ++;
}
}
for(char j = 'a'; j <= 'z'; j ++) {
for(char k = '0'; k <= '9'; k ++ ) {
if(s[i][2] == j || s[i][3] == k) continue;
cnt[da(s[i][0], s[i][1], j, k)] ++;
}
for(char k = 'a'; k <= 'z'; k ++ ) {
if(s[i][2] == j || s[i][3] == k) continue;
cnt[da(s[i][0], s[i][1], j, k)] ++;
}
}
}
return ans;
}
void solve(){
int n, d;
cin >> n >> d;
vector <str> s(n);
for(int i = 0; i < n; i ++) {
cin >> s[i];
}
if(d == 3) {
cout << n * (n - 1) / 2 - d2(n, d, s) - d14(n, 1, s) - d14(n, 4, s);
}
else{
if(d == 2) {
cout << d2(n, d, s);
}
else{
cout << d14(n, d, s);
}
}
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
// freopen(s".in", "r", stdin);
// freopen(s".out", "w", stdout);
int t;
t = 1;
// cin >> t;
for(int i = 1; i <= t; i ++) {
// cout << "Case " << i << ":\n";
solve();
// clean();
}
// while(cin >> n){
// solve();
// }
return 0;
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |