ICPC西安邀请赛的L求条
查看原帖
ICPC西安邀请赛的L求条
1028042
Jason_Harry_Song楼主2024/6/18 22:48
#include <bits/stdc++.h>
#define S 22000000
using namespace std;
int q, opt, x;
string s;
int lth, hs, kind[S], ans[6], inf;
int main() {
	memset(kind, 127, sizeof(kind));
	inf = kind[0];
	scanf("%d", &q);
	while (q--) {
		scanf("%d", &opt);
		cin >> s;
		lth = s.size();
		if (opt == 1) {
			scanf("%d", &x);
			if (inf == kind[0]) {
				inf = x;
			} else {
				inf = max(inf, x);
			}
			hs = 0;
			for (char i : s) {
				hs = hs * 27 + (i - 'a');
			}
			kind[hs] = min(kind[hs], x);
			for (int i = 1; i <= lth; i++) {
				int zt = (1 << i) - 1;
				for (int j = 0; j <= zt; j++) {
					hs = 0;
					for (int k = 1; k <= i; k++) {
						if (((j >> (k - 1)) & 1) == 1) {
							hs = hs * 27 + (s[k - 1] - 'a');
						} else {
							hs = hs * 27 + 26;
						}
					}
					kind[hs] = min(kind[hs], x);
				}
			}
		} else {
			hs = 0;
			for (char i : s) {
				hs = hs * 27 + (i - 'a');
			}
			if (kind[hs] <= 1e9) {
				printf("%d\n", kind[hs]);
			} else {
				ans[0] = inf;
				for (int i = 1; i <= 5; i++) {
					ans[i] = 1000000001;
				}
				for (int i = 1; i <= lth; i++) {
					int zt = (1 << i) - 1;
					for (int j = 0; j <= zt; j++) {
						hs = 0;
						int sim = 0;
						for (int k = 1; k <= i; k++) {
							if (((j >> (k - 1)) & 1) == 1) {
								hs = hs * 27 + (s[k - 1] - 'a');
								sim++;
							} else {
								hs = hs * 27 + 26;
							}
						}
						ans[sim] = min(ans[sim], kind[hs]);
					}
				}
				for (int i = lth; i >= 0; i--) {
					if (ans[i] <= 1e9) {
						printf("%d\n", ans[i]);
						break;
					}
				}
			}
		}
	}
	return 0;
}
2024/6/18 22:48
加载中...