ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#213446 | #2068. 最长公共前缀 | one_zero_four_zero | 11 | 3629ms | 234984kb | C++11 | 3.6kb | 2024-11-11 22:49:22 | 2024-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;
}
详细
小提示:点击横条可展开更详细的信息
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