黄题WA了,求调,悬关
  • 板块学术版
  • 楼主swonkenon
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/12/25 21:12
  • 上次更新2023/12/26 11:11:12
查看原帖
黄题WA了,求调,悬关
729806
swonkenon楼主2023/12/25 21:12

rt 求助 qwq

P8630 [蓝桥杯 2015 国 B] 密文搜索

#include <bits/stdc++.h>
#define int long long
using namespace std;

const int N = (1<<20)+10;
const int mod = 1e9+123;
int n, m, p = 131, cnt, base = 1, h[N], c[20];
char s[N], str[20];
bool vis[20];
set<int> st, beg;

void dfs(int i) {
	if(i == 9) {
		int ans = 0;
		for(int j = 1; j <= 8; j++)
			ans = (ans * p + (int)(str[c[j]])) % mod;
		if(st.find(ans) != st.end()) return;
		st.insert(ans);
		if(beg.find(ans) != beg.end()) ++cnt;
		return;
	}
	for(int j = 1; j <= 8; j++) {
		if(!vis[j]) {
			vis[j] = 1;
			c[j] = i;
			dfs(i + 1);
			vis[j] = 0;
		}
	}
}

signed main() {
	scanf("%s", s + 1);
	m = strlen(s + 1);
	for(int i = 1; i <= m; i++)
		h[i] = (h[i-1] * p + (int)(s[i])) % mod;
	for(int i = 1; i <= 8; i++) {
		base *= p;
		base %= mod;
	}
	for(int i = 1; i <= m - 7; i++)
		beg.insert((h[i+7] - ((h[i-1] * base) % mod) + mod) % mod);
	scanf("%lld", &n);
	while(n--) {
		st.clear();
		memset(vis, 0, sizeof(vis));
		scanf("%s", str + 1);
		dfs(1);
	}
	printf("%lld\n", cnt);
	return 0;
}
2023/12/25 21:12
加载中...