Submission #101084

#TimeUsernameProblemLanguageResultExecution timeMemory
101084choikiwonRound words (IZhO13_rowords)C++17
76 / 100
195 ms55032 KiB
#include<bits/stdc++.h> using namespace std; typedef pair<int, int> pii; const int MN = 2010; int N, M; string S, T; int len[MN << 1][MN]; pii par[MN << 1][MN]; int root; int trace(int r, int c) { int ret = 0; while(r != root || c) { int nr = par[r][c].first; int nc = par[r][c].second; r = nr; c = nc; ret++; } return ret; } void reroot() { int i = root; int j = 1; while(j <= M && par[i][j] != pii(i - 1, j - 1)) j++; if(j > M) return; par[i][j] = pii(i, j - 1); while(i < 2 * N && j < M) { if(par[i + 1][j] == pii(i, j)) { i++; par[i][j] = pii(i, j - 1); } else if(par[i + 1][j + 1] == pii(i, j)) { i++; j++; par[i][j] = pii(i, j - 1); } else j++; } while(i < 2 * N && par[i + 1][j] == pii(i, j)) { i++; par[i][j] = pii(i, j - 1); } } int main() { std::ios::sync_with_stdio(false); cin >> S >> T; N = S.size(); M = T.size(); for(int i = 0; i <= 2 * N; i++) { for(int j = 0; j <= M; j++) { if(!i && !j) continue; len[i][j] = 1e9; if(j && len[i][j] > len[i][j - 1] + 1) len[i][j] = len[i][j - 1] + 1, par[i][j] = pii(i, j - 1); if(i && j && S[(i - 1) % N] == T[j - 1] && len[i][j] > len[i - 1][j - 1] + 1) len[i][j] = len[i - 1][j - 1] + 1, par[i][j] = pii(i - 1, j - 1); if(i && len[i][j] > len[i - 1][j] + 1) len[i][j] = len[i - 1][j] + 1, par[i][j] = pii(i - 1, j); } } int ans = N + M - trace(N, M); for(int i = 1; i < N; i++) { root++; reroot(); ans = max(ans, N + M - trace(N + i, M)); } cout << ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...