求 363 C 正解。
  • 板块学术版
  • 楼主I_Love_DS
  • 当前回复18
  • 已保存回复18
  • 发布时间2024/7/20 21:55
  • 上次更新2024/7/21 07:40:18
查看原帖
求 363 C 正解。
1118614
I_Love_DS楼主2024/7/20 21:55

我暴力 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。

2024/7/20 21:55
加载中...