UOJ Logo

NOI.AC

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#213439#2068. 最长公共前缀Filberte11225ms123148kbC++112.9kb2024-11-11 22:46:552024-11-11 23:11:49

answer

#include <bits/stdc++.h>
#define ll long long 
using namespace std;
const ll mod1 = 1e9 + 9, mod2 = 1e9 + 7;
const int N = 2050;
int n, m, q;
struct Nod{
    ll x, y;
    Nod operator + (ll v){
        return {(x + v) % mod1, (y + v) % mod2};
    }
    friend Nod operator + (Nod a, Nod b){
        return {(a.x + b.x) % mod1, (a.y + b.y) % mod2};
    }
    friend Nod operator * (Nod a, Nod b){
        return {(a.x * b.x) % mod1, (a.y * b.y) % mod2};
    }
    friend Nod operator - (Nod a, Nod b){
        return {(a.x - b.x + mod1) % mod1, (a.y - b.y + mod2) % mod2};
    }
    friend bool operator == (Nod a, Nod b){
        return a.x == b.x && a.y == b.y;
    }
}heng[N][N], shu[N][N], xie[N][N], pw[N];
const Nod base = {131, 131};
char s[N][N];
Nod get_heng(int i, int j, int k){
    int l = j, r = j + k - 1;
    return heng[i][r] - heng[i][l - 1] * pw[k];
}
Nod get_shu(int i, int j, int k){
    int l = i, r = i + k - 1;
    return shu[r][j] - shu[l - 1][j] * pw[k];
}
Nod get_xie(int i, int j, int k){
    return xie[i + k - 1][j + k - 1] - xie[i - 1][j - 1] * pw[k];
}
void pre_xie(int x, int y){
    for(int ad = 0;x + ad <= n && y + ad <= m;ad++){
        xie[x + ad][y + ad] = xie[x + ad - 1][y + ad - 1] * base + (ll)s[x + ad][y + ad];
    }
        
}
int main(){
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    cin >> n >> m >> q;
    for(int i = 1;i <= n;i++) cin >> s[i] + 1;
    pw[0] = {1, 1};
    for(int i = 1;i <= 2010;i++) pw[i] = pw[i - 1] * base;
    for(int i = 1;i <= n;i++){
        for(int j = 1;j <= m;j++) heng[i][j] = heng[i][j - 1] * base + (ll)s[i][j];
    }
    for(int j = 1;j <= m;j++){
        for(int i = 1;i <= n;i++) shu[i][j] = shu[i - 1][j] * base + (ll)s[i][j];
    }
    pre_xie(1, 1);
    for(int i = 2;i <= n;i++) pre_xie(i, 1);
    for(int i = 2;i <= m;i++) pre_xie(1, i);
    while(q--){
        int x, y, u, v;char op1, op2;
        cin >> x >> y >> op1 >> u >> v >> op2;
        if(s[u][v] != s[x][y]){
            cout << 0 << endl;
            continue;
        }
        int Mx;
        if(op1 == 'H') Mx = m - y + 1;
        else if(op1 == 'V') Mx = n - x + 1;
        else Mx = min(m - y + 1, Mx = n - x + 1);
        if(op2 == 'H') Mx = min(Mx, m - v + 1);
        else if(op2 == 'V') Mx = min(Mx, n - u + 1);
        else Mx = min({Mx, m - v + 1, Mx = n - u + 1});
        int ans, l = 1, r = Mx;
        while(l <= r){
            int mid = (l + r) >> 1;
            Nod v1, v2;
            if(op1 == 'H') v1 = get_heng(x, y, mid);
            else if(op1 == 'V') v1 = get_shu(x, y, mid);
            else v1 = get_xie(x, y, mid);
            if(op2 == 'H') v2 = get_heng(u, v, mid);
            else if(op2 == 'V') v2 = get_shu(u, v, mid);
            else v2 = get_xie(u, v, mid);
            if(v1 == v2) ans = mid, l = mid + 1;
            else r = mid - 1;
        }
        cout << ans << endl;
    }
    return 0;
}

Details

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

Subtask #1:

score: 11
Accepted

Test #1:

score: 11
Accepted
time: 100ms
memory: 99404kb

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: 125ms
memory: 123148kb

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: 0
Time Limit Exceeded

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:


Subtask #3:

score: 0
Skipped

Subtask #4:

score: 0
Skipped