rcpl

This documentation is automatically generated by online-judge-tools/verification-helper

View the Project on GitHub ruthen71/rcpl

:heavy_check_mark: verify/dp/levenshtein_distance.test.cpp

Depends on

Code

#define PROBLEM "https://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=DPL_1_E"

#include <iostream>

#include "dp/levenshtein_distance.hpp"

int main() {
    std::string s, t;
    std::cin >> s >> t;
    std::cout << levenshtein_distance(s, t) << '\n';
    return 0;
}
#line 1 "verify/dp/levenshtein_distance.test.cpp"
#define PROBLEM "https://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=DPL_1_E"

#include <iostream>

#line 2 "dp/levenshtein_distance.hpp"

#include <vector>
#include <string>

template <class T>
int levenshtein_distance(std::vector<T>& a, std::vector<T>& b, const int inf = 1000000000) {
    const int n = (int)(a.size()), m = (int)(b.size());
    std::vector dp(n + 1, std::vector<int>(m + 1, inf));
    // initialize
    dp[0][0] = 0;
    // もらう DP だと dp[i][0], dp[0][j] について初期化が必要
    // for (int i = 0; i < n + 1; i++) dp[i][0] = i;
    // for (int j = 0; j < m + 1; j++) dp[0][j] = j;
    // dp
    for (int i = 0; i <= n; i++) {
        for (int j = 0; j <= m; j++) {
            // a += ?
            if (j + 1 <= m and dp[i][j + 1] > dp[i][j] + 1) {
                dp[i][j + 1] = dp[i][j] + 1;
            }
            // b += ?
            if (i + 1 <= n and dp[i + 1][j] > dp[i][j] + 1) {
                dp[i + 1][j] = dp[i][j] + 1;
            }
            // a[i] = b[i]
            if (i + 1 <= n and j + 1 <= m) {
                int cost = a[i] == b[j] ? 0 : 1;
                if (dp[i + 1][j + 1] > dp[i][j] + cost) {
                    dp[i + 1][j + 1] = dp[i][j] + cost;
                }
            }
        }
    }
    return dp[n][m];
}

int levenshtein_distance(std::string& s, std::string& t, const int inf = 1000000000) {
    const int n = (int)(s.size()), m = (int)(t.size());
    std::vector<int> a(n), b(m);
    for (int i = 0; i < n; i++) a[i] = s[i];
    for (int j = 0; j < m; j++) b[j] = t[j];
    return levenshtein_distance(a, b, inf);
}
#line 6 "verify/dp/levenshtein_distance.test.cpp"

int main() {
    std::string s, t;
    std::cin >> s >> t;
    std::cout << levenshtein_distance(s, t) << '\n';
    return 0;
}
Back to top page