Submission #538053

# Submission time Handle Problem Language Result Execution time Memory
538053 2022-03-16T04:08:39 Z skittles1412 Necklace (Subtask 1-3) (BOI19_necklace1) C++17
9 / 85
1500 ms 460 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 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++) {
			long x = hs.hash(j, j + i), x2 = hs2.hash(j, j + i);
			for (int k = 0; k < i; k++) {
				auto it = cur.find({x, x2});
				if (it != cur.end()) {
					return {i, j, it->second};
				}
				x = hs.rot(i, x);
				x2 = hs2.rot(i, x2);
			}
		}
	}
	assert(false);
}

void solve() {
	Hasher<base, mod> tmp("aba");
	dbg(tmp.hash(0, 2), tmp.rot(2, tmp.hash(0, 2)), tmp.hash(1, 3), tmp.rot(2, tmp.hash(1, 3)));
	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 Partially correct 2 ms 212 KB Output is partially correct
2 Partially correct 1 ms 212 KB Output is partially correct
3 Partially correct 6 ms 328 KB Output is partially correct
4 Partially correct 10 ms 212 KB Output is partially correct
5 Partially correct 13 ms 212 KB Output is partially correct
# Verdict Execution time Memory Grader output
1 Partially correct 2 ms 212 KB Output is partially correct
2 Partially correct 1 ms 212 KB Output is partially correct
3 Partially correct 6 ms 328 KB Output is partially correct
4 Partially correct 10 ms 212 KB Output is partially correct
5 Partially correct 13 ms 212 KB Output is partially correct
6 Partially correct 50 ms 312 KB Output is partially correct
7 Partially correct 136 ms 296 KB Output is partially correct
8 Partially correct 666 ms 320 KB Output is partially correct
9 Partially correct 763 ms 460 KB Output is partially correct
10 Partially correct 954 ms 452 KB Output is partially correct
11 Partially correct 940 ms 332 KB Output is partially correct
12 Partially correct 753 ms 336 KB Output is partially correct
# Verdict Execution time Memory Grader output
1 Partially correct 2 ms 212 KB Output is partially correct
2 Partially correct 1 ms 212 KB Output is partially correct
3 Partially correct 6 ms 328 KB Output is partially correct
4 Partially correct 10 ms 212 KB Output is partially correct
5 Partially correct 13 ms 212 KB Output is partially correct
6 Partially correct 50 ms 312 KB Output is partially correct
7 Partially correct 136 ms 296 KB Output is partially correct
8 Partially correct 666 ms 320 KB Output is partially correct
9 Partially correct 763 ms 460 KB Output is partially correct
10 Partially correct 954 ms 452 KB Output is partially correct
11 Partially correct 940 ms 332 KB Output is partially correct
12 Partially correct 753 ms 336 KB Output is partially correct
13 Execution timed out 1585 ms 412 KB Time limit exceeded
14 Halted 0 ms 0 KB -