QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#876696#850. Edit Distance Yet AgainasdfsdfCompile Error//C++238.1kb2025-01-31 11:16:062025-01-31 11:16:07

Judging History

This is the latest submission verdict.

  • [2025-01-31 11:16:07]
  • Judged
  • [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();
}

Details

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
      |              ^~~~~~~~~~~~