有亿点没看懂题解,求详细解释
查看原帖
有亿点没看懂题解,求详细解释
759274
Stevehim楼主2023/2/15 21:46

就是这个

#include <bits/stdc++.h>
using namespace std;
int nxt[10][10010];
queue<int> num[10];
char ch[114514];
bool ifo[10000];
int n;
int tmp, len;

int main() {
	for (int i = 0; i < 10000; i++) {
		ifo[i] = true;
	}
	cin >> n;
	for (int t = 1; t <= n; t++) {
		scanf("%d %s", &tmp, ch); //最好用scanf,用cin不知道会出什么幺蛾子
		len = strlen(ch);
		for (int i = 0; i < len; i++) {
			num[ch[i] - '0'].push(i);
		}
		for (int i = 0; i < len; i++) {
			for (int k = 0; k < 10; k++) {
				if (num[k].empty()) {
					nxt[k][i] = -1;
				} else {
					nxt[k][i] = num[k].front();
				}
			}
			num[ch[i] - '0'].pop();
		}
		int i, j, k, l;
		for (int r = 0; r < 10000; r ++) {
			if (ifo[r]) { //开始变换,不够的0补位即可
				i = r / 1000;
				j = r / 100 - i * 10;
				k = r / 10 - i * 100 - j * 10;
				l = r % 10;
				if (nxt[i][0] == -1 || nxt[j][nxt[i][0]] == -1 || nxt[k][nxt[j][nxt[i][0]]] == -1
				        || nxt[l][nxt[k][nxt[j][nxt[i][0]]]] == -1) {
					ifo[r] = false;
				}
			}
		}
	}
	int ans = 0;
	for (int i = 0; i < 10000; i++) {
		if (ifo[i]) {
			ans++;
		}
	}
	cout << ans;
	return 0;
}

RT
感激不尽QAQ

2023/2/15 21:46
加载中...