/* 求解 T 中 next[],注释参考 GetExtend() */ voidGetNext(string & T, int & m, int next[]) { int a = 0, p = 0; next[0] = m;
for (int i = 1; i < m; i++) { if (i >= p || i + next[i - a] >= p) { if (i >= p) p = i;
while (p < m && T[p] == T[p - i]) p++;
next[i] = p - i; a = i; } else next[i] = next[i - a]; } }
/* 求解 extend[] */ voidGetExtend(string & S, int & n, string & T, int & m, int extend[], int next[]) { int a = 0, p = 0; GetNext(T, m, next);
for (int i = 0; i < n; i++) { if (i >= p || i + next[i - a] >= p) // i >= p 的作用:举个典型例子,S 和 T 无一字符相同 { if (i >= p) p = i;
while (p < n && p - i < m && S[p] == T[p - i]) p++;
extend[i] = p - i; a = i; } else extend[i] = next[i - a]; } }
intmain() { int next[100]; int extend[100]; string S, T; int n, m; while (cin >> S >> T) { n = S.size(); m = T.size(); GetExtend(S, n, T, m, extend, next);
// 打印 next cout << "next: "; for (int i = 0; i < m; i++) cout << next[i] << " "; // 打印 extend cout << "\nextend: "; for (int i = 0; i < n; i++) cout << extend[i] << " ";
boolcmp(node a, node b) { for (int i = 1; i < a.len; i++) if (a.f[i] - a.f[i - 1] != b.f[i] - b.f[i - 1]) return a.f[i] - a.f[i - 1] < b.f[i] - b.f[i - 1]; }
ll read() { ll x = 0,f = 1; char ch = getchar(); while (ch < '0' || ch > '9') { if (ch == '-') f = -1; ch = getchar(); } while (ch >= '0' && ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); } return x * f; }
intmain() { t = read(); while(t--) { n = read(); k = read(); int pos = 0; if (n < 9) { for (int i = 0; i < n; i++) a[i] = i + 1; do { pos++; for (int i = 0; i < n; i++) No[pos].f[i] = a[i]; }while(next_permutation(a,a + n)); } else { for (int i = 0, j = 8; i < 8; i++, j--) a[i] = n - j;
do { pos++; No[pos].f[0] = n; for (int i = 1; i < n - 8; i++) No[pos].f[i] = i; for (int i = n - 8, j = 0; i < n; i++, j++) No[pos].f[i] = a[j]; }while(next_permutation(a, a + 8)); } for (int i = 1; i <= pos; i++) No[i].len = n; sort(No + 1, No + pos + 1, cmp); for (int i = 0; i < n; i++) printf(i < n - 1?"%d ":"%d\n", No[k].f[i]); } return0; }