QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#876696 | #850. Edit Distance Yet Again | asdfsdf | Compile Error | / | / | C++23 | 8.1kb | 2025-01-31 11:16:06 | 2025-01-31 11:16:07 |
Judging History
This is the latest submission verdict.
- [2025-01-31 11:16:07]
- Judged
- Verdict: Compile Error
- Time: 0ms
- Memory: 0kb
- [2025-01-31 11:16:06]
- Submitted
answer
//구현 1. fread/fwrite 이용
#pragma GCC optimize("O3")
#pragma GCC target("avx2")
#include <bits/stdc++.h>
#include <unistd.h>
using namespace std;
/////////////////////////////////////////////////////////////////////////////////////////////
/*
* Author : jinhan814
* Date : 2021-05-06
* Source : https://blog.naver.com/jinhan814/222266396476
* Description : FastIO implementation for cin, cout.
*/
constexpr int SZ = 1 << 20;
class INPUT {
private:
char read_buf[SZ];
int read_idx, next_idx;
bool __END_FLAG__, __GETLINE_FLAG__;
public:
explicit operator bool() { return !__END_FLAG__; }
bool IsBlank(char c) { return c == ' ' || c == '\n'; }
bool IsEnd(char c) { return c == '\0'; }
char _ReadChar() {
if (read_idx == next_idx) {
next_idx = fread(read_buf, sizeof(char), SZ, stdin);
if (next_idx == 0) return 0;
read_idx = 0;
}
return read_buf[read_idx++];
}
char ReadChar() {
char ret = _ReadChar();
for (; IsBlank(ret); ret = _ReadChar());
return ret;
}
template<typename T> T ReadInt() {
T ret = 0; char cur = _ReadChar(); bool flag = 0;
for (; IsBlank(cur); cur = _ReadChar());
if (cur == '-') flag = 1, cur = _ReadChar();
for (; !IsBlank(cur) && !IsEnd(cur); cur = _ReadChar()) ret = 10 * ret + (cur & 15);
if (IsEnd(cur)) __END_FLAG__ = 1;
return flag ? -ret : ret;
}
string ReadString() {
string ret; char cur = _ReadChar();
for (; IsBlank(cur); cur = _ReadChar());
for (; !IsBlank(cur) && !IsEnd(cur); cur = _ReadChar()) ret.push_back(cur);
if (IsEnd(cur)) __END_FLAG__ = 1;
return ret;
}
double ReadDouble() {
string ret = ReadString();
return stod(ret);
}
string getline() {
string ret; char cur = _ReadChar();
for (; cur != '\n' && !IsEnd(cur); cur = _ReadChar()) ret.push_back(cur);
if (__GETLINE_FLAG__) __END_FLAG__ = 1;
if (IsEnd(cur)) __GETLINE_FLAG__ = 1;
return ret;
}
friend INPUT& getline(INPUT& in, string& s) { s = in.getline(); return in; }
} _in;
class OUTPUT {
private:
char write_buf[SZ];
int write_idx;
public:
~OUTPUT() { Flush(); }
explicit operator bool() { return 1; }
void Flush() {
fwrite(write_buf, sizeof(char), write_idx, stdout);
write_idx = 0;
}
void WriteChar(char c) {
if (write_idx == SZ) Flush();
write_buf[write_idx++] = c;
}
template<typename T> int GetSize(T n) {
int ret = 1;
for (n = n >= 0 ? n : -n; n >= 10; n /= 10) ret++;
return ret;
}
template<typename T> void WriteInt(T n) {
int sz = GetSize(n);
if (write_idx + sz >= SZ) Flush();
if (n < 0) write_buf[write_idx++] = '-', n = -n;
for (int i = sz; i-- > 0; n /= 10) write_buf[write_idx + i] = n % 10 | 48;
write_idx += sz;
}
void WriteString(string s) { for (auto& c : s) WriteChar(c); }
void WriteDouble(double d) { WriteString(to_string(d)); }
} _out;
/* operators */
INPUT& operator>> (INPUT& in, char& i) { i = in.ReadChar(); return in; }
INPUT& operator>> (INPUT& in, string& i) { i = in.ReadString(); return in; }
template<typename T, typename std::enable_if_t<is_arithmetic_v<T>>* = nullptr>
INPUT& operator>> (INPUT& in, T& i) {
if constexpr (is_floating_point_v<T>) i = in.ReadDouble();
else if constexpr (is_integral_v<T>) i = in.ReadInt<T>(); return in;
}
OUTPUT& operator<< (OUTPUT& out, char i) { out.WriteChar(i); return out; }
OUTPUT& operator<< (OUTPUT& out, string i) { out.WriteString(i); return out; }
template<typename T, typename std::enable_if_t<is_arithmetic_v<T>>* = nullptr>
OUTPUT& operator<< (OUTPUT& out, T i) {
if constexpr (is_floating_point_v<T>) out.WriteDouble(i);
else if constexpr (is_integral_v<T>) out.WriteInt<T>(i); return out;
}
/* macros */
#define fastio 1
#define cin _in
#define cout _out
#define istream INPUT
#define ostream OUTPUT
/////////////////////////////////////////////////////////////////////////////////////////////
#ifdef _MSC_VER
# include <intrin.h>
# define __builtin_popcount __popcnt
#endif
#include <bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("avx,avx2,fma")
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef long double ld;
#define MAX 4020202
#define MAXS 21
#define INF 1e18
#define TC 1
#define ln '\n'
#define bb ' '
int sa[MAX];
int gr[MAX];
int ngr[MAX];
int cnt[MAX];
int imsi[MAX];
void Suffix_array(string s) {
int n = (int)s.size(), m = max(300ll, n + 1ll);
for (int i = 0; i < m; i++) cnt[i] = imsi[i] = 0;
for (int i = 0; i < n; ++i) sa[i] = i, gr[i] = s[i], ngr[i] = ngr[i + n] = gr[i + n] = 0;
for (int len = 1; len < n; len <<= 1) {
for (int i = 0; i < m; ++i) cnt[i] = 0;
for (int i = 0; i < n; ++i) ++cnt[gr[i + len]];
for (int i = 1; i < m; ++i) cnt[i] += cnt[i - 1];
for (int i = n - 1; i >= 0; --i) imsi[--cnt[gr[i + len]]] = i;
for (int i = 0; i < m; ++i) cnt[i] = 0;
for (int i = 0; i < n; ++i) ++cnt[gr[i]];
for (int i = 1; i < m; ++i) cnt[i] += cnt[i - 1];
for (int i = n - 1; i >= 0; --i) sa[--cnt[gr[imsi[i]]]] = imsi[i];
ngr[sa[0]] = 1;
for (int i = 1; i < n; ++i) ngr[sa[i]] = ngr[sa[i - 1]] + (gr[sa[i - 1]] < gr[sa[i]] || (gr[sa[i - 1]] == gr[sa[i]] && gr[sa[i - 1] + len] < gr[sa[i] + len]));
swap(gr, ngr);
if (gr[sa[n - 1]] == n) break;
}
}
int rk[MAX];
int lcp[MAX];
void Lcp(string s) {
int n = (int)s.size(); s += '^';
for (int i = 0; i < n; ++i) rk[sa[i]] = i;
for (int i = 0, j = 0; i < n; ++i) if (rk[i]) {
while (s[i + j] == s[sa[rk[i] - 1] + j]) ++j;
lcp[rk[i]] = (j ? j-- : 0);
}
}
int N, M, K;
int X;
int sp[MAX][MAXS];
inline int getnext(int a, int b) {
if (a == N || b == M) return 0;
int p, q;
p = rk[a];
q = rk[N + 1 + b];
if (p > q) swap(p, q);
int d = q - p;
int i;
int res = 1e9;
for (i = 0; i < MAXS; i++) if (d >> i & 1) {
res = min(res, sp[p][i]);
p += 1 << i;
}
return res;
}
int dp[1010][2020];
pii path[1010][2020];
void solve() {
cin >> N >> M >> K;
string s, t;
cin >> s >> t;
if (s == t) {
cout << "YES" << ln;
cout << 0 << ln;
return;
}
if (abs(N - M) > K) {
cout << "NO" << ln;
return;
}
string c = s + '#' + t;
Suffix_array(c);
Lcp(c);
X = c.size();
int i, j;
for (i = 0; i + 1 < X; i++) sp[i][0] = lcp[i + 1];
sp[X - 1][0] = 1e9;
for (j = 1; j < MAXS; j++) {
for (i = 0; i < X; i++) {
int n = i + (1 << (j - 1));
n = min(n, X - 1);
sp[i][j] = min(sp[i][j - 1], sp[n][j - 1]);
}
}
for (i = 0; i <= K; i++) for (j = -K - 5; j <= K + 5; j++) dp[i][j + K] = -1;
dp[0][K] = getnext(0, 0);
for (i = 0; i < K; i++) {
for (j = -i; j <= i; j++) {
if (!~dp[i][j + K]) continue;
int a, b;
a = dp[i][j + K];
b = a + j;
if (a == N && b == M) continue;
if (a == N) {
if (dp[i + 1][j + 1 + K] < a) {
dp[i + 1][j + 1 + K] = a;
path[i + 1][j + 1 + K] = pii(j, 2);
}
continue;
}
if (b == M) {
if (dp[i + 1][j - 1 + K] < a) {
dp[i + 1][j - 1 + K] = a;
path[i + 1][j - 1 + K] = pii(j, 1);
}
continue;
}
int na, nb;
for (int k = 1; k < 4; k++) {
na = a + (k & 1);
nb = b + (k >> 1);
int d = getnext(na, nb);
na += d;
nb += d;
if (dp[i + 1][nb - na + K] < na) {
dp[i + 1][nb - na + K] = na;
path[i + 1][nb - na + K] = pii(j, k);
}
}
}
}
int d = M - N;
int ans = 0;
for (i = 1; i <= K; i++) {
if (dp[i][d + K] == N) {
ans = i;
break;
}
}
if (!ans) {
cout << "NO" << ln;
return;
}
cout << "YES" << ln;
cout << ans << ln;
int a, b;
a = N;
b = M;
for (i = ans; i >= 1; i--) {
pii p = path[i][b - a + K];
int na, nb;
na = dp[i - 1][p.first + K];
nb = na + p.first;
if (p.second == 1) cout << "DELETE" << bb << na + 1 << ln;
if (p.second == 2) cout << "INSERT" << bb << na + 1 << bb << t[nb] << ln;
if (p.second == 3) cout << "REPLACE" << bb << na + 1 << bb << t[nb] << ln;
a = na;
b = nb;
}
}
signed main() {
//ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
int T;
cin >> T;
while (T--) solve();
}
詳細信息
In file included from /usr/include/c++/14/string:43, from /usr/include/c++/14/bitset:52, from /usr/include/x86_64-linux-gnu/c++/14/bits/stdc++.h:52, from answer.code:4: /usr/include/c++/14/bits/allocator.h: In destructor ‘constexpr std::__cxx11::basic_string<char>::_Alloc_hider::~_Alloc_hider()’: /usr/include/c++/14/bits/allocator.h:182:7: error: inlining failed in call to ‘always_inline’ ‘constexpr std::allocator< <template-parameter-1-1> >::~allocator() noexcept [with _Tp = char]’: target specific option mismatch 182 | ~allocator() _GLIBCXX_NOTHROW { } | ^ In file included from /usr/include/c++/14/string:54: /usr/include/c++/14/bits/basic_string.h:186:14: note: called from here 186 | struct _Alloc_hider : allocator_type // TODO check __is_final | ^~~~~~~~~~~~