QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#367670#850. Edit Distance Yet AgainSlongodWA 2807ms27472kbC++144.4kb2024-03-26 11:40:052024-03-26 11:40:06

Judging History

你现在查看的是最新测评结果

  • [2024-03-26 11:40:06]
  • 评测
  • 测评结果:WA
  • 用时:2807ms
  • 内存:27472kb
  • [2024-03-26 11:40:05]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
namespace Slongod{
const int N = 1e6+7 , M = 1005 , mod1 = 998244353 , mod2 = 1e9+7 , inf = 0x3f3f3f3f;

namespace hash
{
    int seed1 , seed2 , pw1[N] , pw2[N]; mt19937 rd(time(nullptr));
    inline void inithash()
    {
        seed1 = uniform_int_distribution<>(1,100)(rd);
        seed2 = uniform_int_distribution<>(1,100)(rd);
        pw1[0] = 1; for (int i = 1; i < N; i++){pw1[i] = 1ll * pw1[i-1] * seed1 % mod1;}
        pw2[0] = 1; for (int i = 1; i < N; i++){pw2[i] = 1ll * pw2[i-1] * seed2 % mod2;}
    }
    inline void makehash(const int n , const char s[] , pair<int,int> hash[])
    {
        hash[0] = {0 , 0};
        for (int i = 1; i <= n; i++) {
            hash[i].first = (1ll * hash[i-1].first * seed1 + s[i]) % mod1;
            hash[i].second = (1ll * hash[i-1].second * seed2 + s[i]) % mod2;
        }
    }
    inline pair<int,int> gethash(int l , int r , pair<int,int> hash[])
    {
        int res1 = (hash[r].first - 1ll * hash[l-1].first * pw1[r - l + 1] % mod1 + mod1) % mod1;
        int res2 = (hash[r].second - 1ll * hash[l-1].second * pw2[r - l + 1] % mod2 + mod2) % mod2;
        return {res1 , res2};
    }
}

int T , n , m , k , *rk[M] , *fa[M];
char s[N] , t[N];
pair<int,int> hs[N] , ht[N];
inline int lcp(int x , int y)
{
    int l = 0 , r = min(n - x + 1 , m - y + 1) , res = 0;
    while(l <= r) {
        int mid = (r - l) / 2 + l;
        if (hash::gethash(x , x + mid - 1 , hs) == hash::gethash(y , y + mid - 1 , ht)) {
            res = mid; l = mid + 1;
        } else {
            r = mid - 1;
        }
    } return res;
}
int output(int dep , int j)
{
    if (dep == 0){return 0;}
    int delta = output(dep - 1 , fa[dep][j]);
    int x = rk[dep][j] , y = x - j;
    int tx = rk[dep-1][fa[dep][j]] , ty = tx - fa[dep][j];
    if (x - tx > y - ty) {
        cout << "DELETE " << tx + 1 + delta << '\n';
        return delta - 1;
    }
    if (y - ty > x - tx) {
        cout << "INSERT " << tx + 1 + delta << ' ' << t[ty + 1] << '\n';
        return delta + 1;
    }
    cout << "REPLACE " << tx + 1 + delta << ' ' << t[ty + 1] << '\n';
    return delta;
}
void main()
{
    for (int i = 0; i < M; i++) {
        rk[i] = new int[M*2]; rk[i] += M;
        fa[i] = new int[M*2]; fa[i] += M;
    } hash::inithash();

    bool flag = false;
    for (cin >> T , flag = T < 10; T; T--) {
        //Input and Inithash/DP
        cin >> n >> m >> k >> (s + 1) >> (t + 1);
        if (k == 0 and T == 100){flag = true;}
        hash::makehash(n , s , hs); hash::makehash(m , t , ht);
        for (int i = 0; i <= k; i++) {
            for (int j = -k; j <= k; j++) {
                rk[i][j] = -inf; fa[i][j] = 0;
            }
        }

        //DongPlan
        rk[0][0] = lcp(1 , 1);
        for (int i = 0; i <= k; i++) {
            for (int j = -k , x , y , tmp; j <= k; j++) {
                if (rk[i][j] != -inf) {
                    x = rk[i][j]; y = rk[i][j] - j;
                    //S 走一步
                    if (x < n) {
                        tmp = lcp(x + 2 , y + 1);
                        if (x + 1 + tmp > rk[i+1][j+1]) {
                            rk[i+1][j+1] = x + 1 + tmp;
                            fa[i+1][j+1] = j;
                        }
                    }
                    //T 走一步
                    if (y < m) {
                        tmp = lcp(x + 1 , y + 2);
                        if (x + tmp > rk[i+1][j-1]) {
                            rk[i+1][j-1] = x + tmp;
                            fa[i+1][j-1] = j;
                        }
                    }
                    //同时走一步
                    if (x < n and y < m) {
                        tmp = lcp(x + 2 , y + 2);
                        if (x + 1 + tmp > rk[i+1][j]) {
                            rk[i+1][j] = x + 1 + tmp;
                            fa[i+1][j] = j;
                        }
                    }
                }
            }
        }
        int ans = -1;
        for (int i = 0; i <= k; i++) {
            if (rk[i][n-m] == n) {
                ans = i; break;
            }
        }
        if (flag or T == 83) {
            if (ans == -1){cout << "NO\n";}
            else{cout << "YES\n" << ans << '\n'; output(ans , n - m);}
        }
    }
}
}int main()
{
    ios :: sync_with_stdio(0);
    cin.tie(0) , cout.tie(0);
    return Slongod :: main(),0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 5ms
memory: 19708kb

input:

2
3 4 3
kot
plot
5 7 3
zycie
porazka

output:

YES
2
INSERT 1 p
REPLACE 2 l
NO

result:

ok OK!

Test #2:

score: 0
Accepted
time: 13ms
memory: 20300kb

input:

100
100 100 0
mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
16 7 100
vvvvvvvvvvvvvvvv
qydopaq
37 33 43
ggggggggggggggggggggggggggggggggggggg
osk...

output:

YES
0
YES
16
REPLACE 1 q
REPLACE 2 y
REPLACE 3 d
REPLACE 4 o
REPLACE 5 p
REPLACE 6 a
REPLACE 7 q
DELETE 8
DELETE 8
DELETE 8
DELETE 8
DELETE 8
DELETE 8
DELETE 8
DELETE 8
DELETE 8
YES
28
REPLACE 1 o
REPLACE 2 s
REPLACE 3 k
REPLACE 5 m
REPLACE 6 l
REPLACE 8 j
REPLACE 9 t
REPLACE 10 u
REPLACE 11 a
REPLA...

result:

ok OK!

Test #3:

score: -100
Wrong Answer
time: 2807ms
memory: 27472kb

input:

100
3211 3185 685
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww...

output:

NO

result:

wrong answer At test 0 expected YES got NO