# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
477395 | ace_in_the_hole | Necklace (Subtask 4) (BOI19_necklace4) | C++14 | 373 ms | 464 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<bits/stdc++.h>
using namespace std;
const int MAX = 1e5 + 100;
int pi[MAX], pi_rev[MAX];
void calc(string& s, int (&pi)[MAX]) {
pi[0] = 0;
int n = s.size();
for (int j = 0, i = 1; i < n; i++) {
pi[i] = 0;
while (s[j] != s[i]) {
if (j == 0) break;
j = pi[j-1];
}
if (s[i] == s[j]) pi[i] = ++j;
}
}
int suff[MAX], pref[MAX];
void maximize(int& var, const int& val) { if (val > var) var = val;}
int m,n, longest = 0, idx_a, idx_b;
#define cst const string&
void find_necklace(cst a, cst b, cst a_rev, cst b_rev, const int& shift, bool rev) {
for (int i = 0; i <= n; i++) suff[i] = pref[i] = 0;
string word = a + '$' + b;
calc(word, pi);
for (int i = m+1; i <= m+n; i++) suff[i-m] = pi[i];
word = a_rev + '$' + b_rev;
calc(word, pi_rev);
for (int i = m+1; i <= m+n; i++)
if (pi_rev[i]) maximize(pref[n-(i-m)+pi_rev[i]], pi_rev[i]);
// if (shift == 5) cerr << "HELLO. " << a << " vs. " << b << "\n";
// for (int i = 1; i <= n; i++) cerr << pref[i] << ' '; cerr << '\n';
// for (int i = 1; i <= n; i++) cerr << suff[i] << ' '; cerr << '\n';
for (int i = 1; i <= n; i++) {
int length = pref[i] + suff[i-pref[i]];
if (length > longest) {
int ib = rev ? n-i : i-length;
int ia = (suff[i-pref[i]]-length+shift+m) % m;
if (length >= m) ia = 0;
if (ia + length <= m)
// cerr << "comparing " << a << " with " << b << '\n',
// cerr << "start at b[" << i << "] --> ",
// cerr << length << '/' << suff[i-pref[i]] << ',' << i << '\n',
longest = length, idx_b = ib, idx_a = ia;
}
}
/*
abcd
cdab
abcd
badc
azbc
bxac
abc
bac
*/
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
// freopen("debug.txt", "w", stderr);
string A, B;
cin >> A >> B;
string B_rev = B, A_rev = A;
reverse(B_rev.begin(), B_rev.end());
reverse(A_rev.begin(), A_rev.end());
::m = (int) A.size();
::n = (int) B.size();
for (int shift = 0; shift < m; shift++) {
find_necklace(A, B, A_rev, B_rev, shift, false);
find_necklace(A, B_rev, A_rev, B, shift, true);
A.push_back(A.front());
A.erase(0,1);
A_rev = A;
reverse(A_rev.begin(), A_rev.end());
}
printf("%d\n%d %d", longest, idx_a, idx_b);
}
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |