제출 #992159

#제출 시각아이디문제언어결과실행 시간메모리
992159CatasNecklace (Subtask 4) (BOI19_necklace4)C++14
15 / 15
183 ms604 KiB
#include <bits/stdc++.h> #define ll long long int #define pii pair<int, int> #define pll pair<ll, ll> #define rep(b) for(ll i = 0; i<b; i++) #define repn(a, b) for(ll b = 0; i<a; i++) #define LSOne(S) (S & -(S)) #define mem(a, b) memset(a, b, sizeof(a)) #define MOD 1000000007ll #define MAXN 6002 using namespace std; void suffix_array(string const& s, vector<ll>& p, vector<ll>& lcp) { int n = s.size(); const int alphabet = 256; vector<int> c(n), cnt(max(alphabet, n), 0); for (int i = 0; i < n; i++) cnt[s[i]]++; for (int i = 1; i < alphabet; i++) cnt[i] += cnt[i-1]; for (int i = 0; i < n; i++) p[--cnt[s[i]]] = i; c[p[0]] = 0; int classes = 1; for (int i = 1; i < n; i++) { if (s[p[i]] != s[p[i-1]]) classes++; c[p[i]] = classes - 1; } vector<int> pn(n), cn(n); for (int h = 0; (1 << h) < n; ++h) { for (int i = 0; i < n; i++) { pn[i] = p[i] - (1 << h); if (pn[i] < 0) pn[i] += n; } fill(cnt.begin(), cnt.begin() + classes, 0); for (int i = 0; i < n; i++) cnt[c[pn[i]]]++; for (int i = 1; i < classes; i++) cnt[i] += cnt[i-1]; for (int i = n-1; i >= 0; i--) p[--cnt[c[pn[i]]]] = pn[i]; cn[p[0]] = 0; classes = 1; for (int i = 1; i < n; i++) { pair<int, int> cur = {c[p[i]], c[(p[i] + (1 << h)) % n]}; pair<int, int> prev = {c[p[i-1]], c[(p[i-1] + (1 << h)) % n]}; if (cur != prev) ++classes; cn[p[i]] = classes - 1; } c.swap(cn); } int k = 0; for(int i = 0; i < n-1; i++){ int pi = c[i]; int j = p[pi-1]; while(s[i+k] == s[j+k]) k++; lcp[pi] = k; k = max(k-1, 0); } } int pi1[MAXN], pi2[MAXN]; void kmp(string s, int* pi){ pi[0] = 0; int len = 0, j = 1, m = s.size(); while(j<m){ if(s[j] == s[len]){ pi[j] = ++len; j++; } else{ if(len) len = pi[len-1]; else{ pi[j] = 0; j++; } } } } void solution(string s, string t, vector<int>& ans, bool rev){ int n = s.size(), m = t.size(); for(int i = 0; i < n; i++){ string s1 = s.substr(0, i), s2 = s.substr(i, n-i); reverse(s1.begin(), s1.end()); string t1 = t, t2 = t; reverse(t2.begin(), t2.end()); kmp(s1 + "#" + t1, pi1); kmp(s2 + "#" + t2, pi2); for(int j = 1; j<=m; j++){ if(pi1[i + j] + pi2[n + m - i - j] > ans[0]){ ans[0] = pi1[i+j] + pi2[n+m-i-j]; ans[1] = i - pi1[i+j]; ans[2] = rev ? m - j - pi2[n+m-i-j] : j - pi1[i+j]; } } } } void solve(){ string s, t; cin>>s>>t; vector<int> ans(3, 0); solution(s, t, ans, 0); reverse(t.begin(), t.end()); solution(s, t, ans, 1); cout<<ans[0]<<'\n'<<ans[1]<<' '<<ans[2]<<'\n'; } int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); ll t = 1; //cin>>t; while(t--){ solve(); } }
#Verdict Execution timeMemoryGrader output
Fetching results...