#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 |
- |