萌新求助 RE40pts
查看原帖
萌新求助 RE40pts
350270
CatFromMars楼主2024/8/5 18:36

如题,这是代码

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e5;//这里改成 const int N = 2e5 就可以过了
const ll Mod = 1e9 + 7, B = 10;
string S, T;
ll hz[N + 10][2], qp[N + 10];
int get(int l, int r, int opt) {
	return ((hz[r][opt] - hz[l - 1][opt] * qp[r - l + 1]) % Mod + Mod) % Mod;
}
void geth(string str, int opt) {
	for(int i = 1; i < str.size(); i++)
		hz[i][opt] = (hz[i - 1][opt] * B + str[i] - 'A' + 1) % Mod;
}
int lcp(int u, int v) {
	int l = 1, r = min(T.size() - 1, S.size() - 1), ans = 0;
	while(l <= r) {
		int mid = (l + r) >> 1;
		if(get(u, u + mid - 1, 0) == get(v, v + mid - 1, 1))
			ans = mid, l = mid + 1;
		else r = mid - 1;
	}
	return ans;
}
void init() {
	cin >> S >> T;
	S = "#" + S;
	T = "#" + T;
	geth(S, 0);
	geth(T, 1);

	int ans = 0, n1 = S.size() - 1, n2 = T.size() - 1;
	for(int i = 1; i <= n1 - n2 + 1; i++) {
		int p = i, j = 1;
		for(int t = 1; t <= 4; t++) {
			int k = lcp(p, j);
			p = min(p + k - 1, n1);
			j = min(j + k - 1, n2);
			if(j == n2) {
				ans++;
				break;
			}
			p += 2, j += 2;
		}
	}
	cout << ans << endl;
}
int main() {
	qp[0] = 1;
	for(int i = 1; i <= N; i++)
		qp[i] = qp[i - 1] * B % Mod;

	int T; cin >> T;
	while(T--) init(); 
}

不太清楚自己哪里写的不太规范,肯定各位巨佬帮忙斧正 qwq

2024/8/5 18:36
加载中...