求助,hash,WA2&&TLE7
查看原帖
求助,hash,WA2&&TLE7
571143
cloud2764scallop_eve楼主2023/11/3 21:33

rt,代码如下:

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int T = 15, N = 100005, q = 10;
string s;
char f[N];
int n, s1cnt, s2cnt;
int lenS1[T], lenS2[T];
ll p[N], hashs1[T][N], hashs2[T][N], hashf[N];
void init(int x) {
	p[0] = 1;
	for (int i = 1; i <= x; i++) p[i] = p[i - 1] * q;
}
ll hfind(int x, int y) {
	return hashf[x] - hashf[x - y] * p[y];
}
ll ffind(int x) {
	return hashf[x] % q;
}
int main() {
	cin >> s >> n;
	int lens = s.size();
	s[lens] = '?';
	for (int i = 0; i <= lens; i++) {
		if (s[i] == '*') {
			s1cnt++;
			for (int j = i + 1; j <= lens; j++) {
				i++;
				if (s[j] == '*' || s[j] == '?') break;
				lenS1[s1cnt]++;
				hashs1[s1cnt][lenS1[s1cnt]] = hashs1[s1cnt][lenS1[s1cnt] - 1] * q + s[j] - 'a' + 1;

			}
		}
		if (s[i] == '?') {
			s2cnt++;
			for (int j = i + 1; j <= lens; j++) {
				i++;
				if (s[j] == '*' || s[j] == '?') break;
				lenS2[s2cnt]++;
				hashs2[s2cnt][lenS2[s2cnt]] = s[j] - 'a' + 1;
			}
		}
	}
	for (int i = 1; i <= n; i++) {
		scanf("%s", f + 1);
		int lenf = strlen(f + 1);
		init(lenf);
		bool flag1 = 0, flag2 = 0;
		memset(hashf, 0, lenf);
		for (int j = 1; j <= lenf; j++) hashf[j] = hashf[j - 1] * q + f[j] - 'a' + 1;
		for (int j = 1; j <= s1cnt; j++) {
			for (int k = lenS1[j]; k <= lenf; k++) {
				ll tmp = hfind(k, lenS1[j]);
				if (hashs1[j][lenS1[j]] == tmp) {
					flag1 = 1;
					break;
				}
			}
		}
		for (int j = 1; j <= s2cnt; j++) {
			for (int k = 1; k <= lenf; k++) {
				ll tmp = ffind(k);
				for (int m = 1; m <= lenS2[j]; m++) {
					if (hashs2[j][m] == tmp) {
						flag2 = 1;
						break;
					}
				}
			}
		}
		if (flag1 == 1 && flag2 == 1) printf("YES\n");
		else printf("NO\n");
	}
	return 0;
}
2023/11/3 21:33
加载中...