我暴力 dfs + 手动开 O2 过了,但特别极限(赛后)
#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
int n, k, ans = 0, y;
string s, d;
bool vis[15];
unordered_map <string, bool> m;
struct AC {
int cnt;
} ac[15];
inline void dfs(int x) {
if (x == n + 1) {
if (m[d]) return;
ans++;
m[d] = true;
return;
}
for (int i = 1; i <= n; i++) {
if (!vis[i]) {
d.push_back(s[i]);
vis[i] = true;
for (int j = 1; j <= n - k + 1; j++)
if (x >= j + y - 1 && x <= j + k - 1)
ac[j].cnt += (d[x] == d[j + (j + k - 1 - x)]);
bool flag = true;
for (int j = 1; j <= n - k + 1; j++)
if (ac[j].cnt >= (k + 1) / 2) {
flag = false;
break;
}
if (flag) dfs(x + 1);
for (int j = 1; j <= n - k + 1; j++)
if (x >= j + y - 1 && x <= j + k - 1)
ac[j].cnt -= (d[x] == d[j + (j + k - 1 - x)]);
vis[i] = false;
d.pop_back();
}
}
return;
}
int main() {
scanf("%d%d", &n, &k);
y = k / 2 + 1;
cin >> s;
d.push_back(' ');
s = " " + s;
dfs(1);
printf("%d", ans);
return 0;
}
// zyyxz
请大佬多指教。
顺便说一嘴,AT 没有自动开 O2。