就是这个
#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