UOJ Logo

NOI.AC

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#213446#2068. 最长公共前缀one_zero_four_zero113629ms234984kbC++113.6kb2024-11-11 22:49:222024-11-11 23:12:20

answer

#include<bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;

int N, M, Q;
int cur = 2010;
string S[2005];
string R[2005], C[2005], D[4105];
long long mod[2] = {1000005823, 563897093};
int chasize[2] = {131, 127};
long long power[2][5005];
long long F[3][2][4105][2005];
int a, b, x, y;
char d1, d2;
int dir[131][2];

void __init(){
	for (int i = 0; i < 2; i ++){
		power[i][0] = 1LL;
		for (int j = 1; j <= 5000; j ++)
			power[i][j] = (power[i][j - 1] * chasize[i]) % mod[i];
	}
	// id1 = 0
	for (int i = 0; i < 2; i ++)
		for (int j = 1; j <= N; j ++)
			for (int k = 1; k <= M; k ++){
				F[0][i][j][k] = (F[0][i][j][k - 1] * chasize[i] + R[j][k]) % mod[i];
				// cout << 0 << " " << i << " " << j <<  " " << k << " " << F[0][i][j][k] << "\n";
			}
	// id1 = 1
	for (int i = 0; i < 2; i ++)
		for (int j = 1; j <= M; j ++)
			for (int k = 1; k <= N; k ++){
				F[1][i][j][k] = (F[1][i][j][k - 1] * chasize[i] + C[j][k]) % mod[i];
				// cout << 1 << " " << i << " " << j <<  " " << k << " " << F[1][i][j][k] << "\n";
			}
	// id1 = 2
	for (int i = 0; i < 2; i ++)
		for (int j = cur - max(N, M); j <= cur + max(N, M); j ++)
			for (int k = 1; k < (int)D[j].size(); k ++){
				F[2][i][j][k] = (F[2][i][j][k - 1] * chasize[i] + D[j][k]) % mod[i];
				// cout << 2 << " " << i << " " << j <<  " " << k << " " << F[2][i][j][k] << "\n";
			}
}

long long query(int id1, int id2, int l, int r){
	long long res = 0;
	for (int i = 0; i < 2; i ++){
		res *= 1000000000LL;
		long long tmp = (F[id1][i][id2][r] - (F[id1][i][id2][l - 1] * power[i][r - l + 1])) % mod[i];
		tmp = (tmp + mod[i]) % mod[i];
		res += tmp;
	}
	return res;
}

bool check(int l, int a, int b, int x, int y){
	if (a + dir[(int)d1][0] * (l - 1) > N) return 0;
	if (b + dir[(int)d1][1] * (l - 1) > M) return 0;
	if (x + dir[(int)d2][0] * (l - 1) > N) return 0;
	if (y + dir[(int)d2][1] * (l - 1) > M) return 0;
	// -----------------------------------------------------------------
	long long tmp1 = 0, tmp2 = 0;
	if (d1 == 'H') tmp1 = query(0, a, b, b + l - 1);
	else if (d1 == 'V') tmp1 = query(1, b, a, a + l - 1);
	else tmp1 = query(2, a - b + cur, min(a, b), min(a, b) + l - 1);
	if (d2 == 'H') tmp2 = query(0, x, y, y + l - 1);
	else if (d2 == 'V') tmp2 = query(1, y, x, x + l - 1);
	else tmp2 = query(2, x - y + cur, min(x, y), min(x, y) + l - 1);
	// cout << tmp1 << " " << tmp2 << ";;\n";
	return tmp1 == tmp2;
}

int solve(){
	int res = 0, l = 0, r = 2005;
	while (l <= r){
		int mid = (l + r) >> 1;
		if (check(mid, a, b, x, y)){
			res = mid;
			l = mid + 1;
		}else{
			r = mid - 1;
		}
	}
	return res;
}

int main(){
#ifndef ONLINE_JUDGE
	freopen("../data.in", "r", stdin);
	freopen("../data.out", "w", stdout);
#endif
	ios::sync_with_stdio(0);
	cin.tie(0);
	
	cin >> N >> M >> Q;
	dir['H'][0] = 0, dir['H'][1] = 1;
	dir['V'][0] = 1, dir['V'][1] = 0;
	dir['D'][0] = 1, dir['D'][1] = 1;
	for (int i = 0; i <= 2000; i ++) C[i] = R[i] = " ";
	for (int i = 0; i <= 4100; i ++) D[i] = " ";
	for (int i = 1; i <= N; i ++){
		cin >> S[i];
		S[i] = " " + S[i];
		for (int j = 1; j <= M; j ++){
			R[i].push_back(S[i][j]);
			C[j].push_back(S[i][j]);
			D[i - j + cur].push_back(S[i][j]);
		}
	}
	/*
	for (int i = 1; i <= N; i ++){
		cout << R[i] << "          A\n";
	}
	for (int i = 1; i <= N; i ++){
		cout << C[i] << "          B\n";
	}
	for (int i = cur - N - M; i <= cur + N + M; i ++){
		cout << D[i] << "          C\n";
	}
	*/
	__init();
	while (Q --){
		cin >> a >> b >> d1 >> x >> y >> d2;
		cout << solve() << "\n";
	}
	
	return 0;
}

Details

小提示:点击横条可展开更详细的信息

Subtask #1:

score: 11
Accepted

Test #1:

score: 11
Accepted
time: 344ms
memory: 144208kb

input:

1000 2000 10000
awanannwnnaaawwnwawanwnwaaaanwnaaananwawwwwnannannawwwawwaaaaannwnwnwnnaaawaawawannn...

output:

0
0
0
0
0
0
0
2
0
1
0
0
1
0
1
0
2
0
1
2
0
0
2
0
1
1
0
0
0
0
1
0
0
0
1
0
0
1
0
1
1
0
2
0
1
3
1
0
3
0
...

result:

ok 10000 tokens

Test #2:

score: 0
Accepted
time: 347ms
memory: 143928kb

input:

2000 1000 10000
zzqzqqqqqzqqqqzqqqqzqzqzzzqqzqqqzzqzzqqqqqqqqqqqzzqzqqqzzqqzzqzqzzzqqzqqzzzzzzqzzzqq...

output:

0
3
3
1
0
2
2
2
1
0
1
0
0
0
1
0
2
0
6
1
0
1
1
0
2
1
1
1
2
4
0
1
3
2
1
0
1
2
0
0
0
1
1
0
1
1
0
4
0
3
...

result:

ok 10000 tokens

Subtask #2:

score: 0
Time Limit Exceeded

Test #3:

score: 24
Accepted
time: 2938ms
memory: 234984kb

input:

2000 2000 1000000
gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg...

output:

1146
541
203
322
618
166
345
138
520
206
1031
667
741
921
361
1110
1057
372
899
209
491
69
93
639
14...

result:

ok 1000000 tokens

Test #4:

score: -24
Time Limit Exceeded

input:

2000 2000 1000000
svsvsvvsvssssvsvvvvssvvvssvsvsvssssvvsvvvsvvsssvssssvssvvsvvvssssssvsvvvvsssvvvsss...

output:

2
0
2
1
2
0
0
1
3
1
0
0
0
1
0
1
0
1
0
6
1
2
2
1
3
5
0
0
1
1
0
0
2
1
1
3
1
0
0
2
1
0
0
0
0
0
1
0
5
0
...

result:


Subtask #3:

score: 0
Skipped

Subtask #4:

score: 0
Skipped