Submission #1322916

#TimeUsernameProblemLanguageResultExecution timeMemory
1322916dadadadadPIN (CEOI10_pin)C++20
60 / 100
1095 ms16180 KiB

#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 timeMemoryGrader output
Fetching results...