Submission #538057

# Submission time Handle Problem Language Result Execution time Memory
538057 2022-03-16T04:16:37 Z skittles1412 Necklace (Subtask 1-3) (BOI19_necklace1) C++17
45 / 85
1500 ms 448 KB
#include "bits/extc++.h"

using namespace std;

template <typename T>
void dbgh(const T& t) {
	cerr << t << endl;
}

template <typename T, typename... U>
void dbgh(const T& t, const U&... u) {
	cerr << t << " | ";
	dbgh(u...);
}

#ifdef DEBUG
#define dbg(...)                                           \
	cerr << "L" << __LINE__ << " [" << #__VA_ARGS__ << "]" \
		 << ": ";                                          \
	dbgh(__VA_ARGS__)
#else
#define cerr   \
	if (false) \
	cerr
#define dbg(...)
#endif

#define endl "\n"
#define long int64_t
#define sz(x) int((x).size())

constexpr long bpow(long base, long exp, long mod) {
	long ans = 1;
	while (exp) {
		if (exp & 1) {
			ans = (ans * base) % mod;
		}
		exp >>= 1;
		base = (base * base) % mod;
	}
	return ans;
}

constexpr long inv(long x, long mod) {
	return bpow(x, mod - 2, mod);
}

template <long base, long mod>
struct Pow {
	static constexpr int maxn = 3e3 + 5;
	long arr[maxn];

	constexpr Pow() : arr() {
		arr[0] = 1;
		for (int i = 1; i < maxn; i++) {
			arr[i] = (arr[i - 1] * base) % mod;
		}
	}

	long operator[](int i) const {
		return arr[i];
	}
};

template <long base, long mod>
struct Hasher {
	static constexpr long ibase = inv(base, mod);
	static constexpr Pow<base, mod> pow {};
	static constexpr Pow<ibase, mod> ipow {};
	vector<long> psum;

	explicit Hasher(const string& s) : psum(sz(s) + 1) {
		for (int i = 0; i < sz(s); i++) {
			psum[i + 1] = (psum[i] + (s[i] - 'a' + 1) * pow[i]) % mod;
		}
	}

	long hash(int l, int r) const {
		return (psum[r] - psum[l] + mod) * ipow[l] % mod;
	}

	long merge(int len, long a, long b) const {
		return (a + b * pow[len]) % mod;
	}

	long rot(int len, long h) const {
		long x = h % base;
		return ((h - x + mod) * ibase + x * pow[len - 1]) % mod;
	}
};

const long base = 31, base2 = 29, mod = 1e9 + 7;

tuple<int, int, int> solve(const string& s, const string& t) {
	Hasher<base, mod> hs(s), ht(t);
	Hasher<base2, mod> hs2(s), ht2(t);
	int n = sz(s), m = sz(t);
	for (int i = n; i >= 1; i--) {
		map<pair<long, long>, int> cur, cur2;
		for (int j = 0; j + i <= m; j++) {
			cur[{ht.hash(j, j + i), ht2.hash(j, j + i)}] = j;
		}
		for (int j = 0; j + i <= n; j++) {
			for (int k = 0; k < i; k++) {
				long x = hs.merge(i - k, hs.hash(j + k, j + i), hs.hash(j, j + k));
				long x2 = hs2.merge(i - k, hs2.hash(j + k, j + i), hs2.hash(j, j + k));
				auto it = cur.find({x, x2});
				if (it != cur.end()) {
					return {i, j, it->second};
				}
			}
		}
	}
	assert(false);
}

void solve() {
	{
		Hasher<base, mod> tmp("bcbcccb"), tmp1("cbcccbb");
		long x = tmp.hash(0, 7);
		for (int i = 0; i < 7; i++) {
			x = tmp.rot(7, x);
			dbg(x);
		}
		dbg(tmp1.hash(0, 7));
	}
	string s, t;
	cin >> s >> t;
	auto [x, a, b] = solve(s, t);
	reverse(begin(s), end(s));
	auto [x1, a1, b1] = solve(s, t);
	dbg(x, a, b, x1, a1, b1);
	if (x1 > x) {
		x = x1;
		a = sz(s) - a1 - x;
		b = b1;
	}
	cout << x << endl;
	cout << a << " " << b << endl;
}

int main() {
	cin.tie(nullptr);
	ios_base::sync_with_stdio(false);
	cin.exceptions(ios::failbit);
	solve();
}
# Verdict Execution time Memory Grader output
1 Correct 2 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Correct 6 ms 212 KB Output is correct
4 Correct 10 ms 212 KB Output is correct
5 Correct 16 ms 340 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Correct 6 ms 212 KB Output is correct
4 Correct 10 ms 212 KB Output is correct
5 Correct 16 ms 340 KB Output is correct
6 Correct 42 ms 212 KB Output is correct
7 Correct 108 ms 212 KB Output is correct
8 Correct 493 ms 332 KB Output is correct
9 Correct 756 ms 448 KB Output is correct
10 Correct 1114 ms 332 KB Output is correct
11 Correct 1122 ms 328 KB Output is correct
12 Correct 696 ms 448 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Correct 6 ms 212 KB Output is correct
4 Correct 10 ms 212 KB Output is correct
5 Correct 16 ms 340 KB Output is correct
6 Correct 42 ms 212 KB Output is correct
7 Correct 108 ms 212 KB Output is correct
8 Correct 493 ms 332 KB Output is correct
9 Correct 756 ms 448 KB Output is correct
10 Correct 1114 ms 332 KB Output is correct
11 Correct 1122 ms 328 KB Output is correct
12 Correct 696 ms 448 KB Output is correct
13 Execution timed out 1578 ms 404 KB Time limit exceeded
14 Halted 0 ms 0 KB -