제출 #823944

#제출 시각아이디문제언어결과실행 시간메모리
823944tch1cherinNecklace (Subtask 4) (BOI19_necklace4)C++17
15 / 15
350 ms440 KiB
#include <bits/stdc++.h>
using namespace std;
 
vector<int> prefix_function(string s) {
  int n = (int)s.size();
  vector<int> pi(n);
  for (int i = 1; i < n; ++i) {
    int j = pi[i - 1];
    while (j > 0 && s[i] != s[j]) {
      j = pi[j - 1];
    }
    if (s[i] == s[j]) {
      ++j;
    }
    pi[i] = j;
  }
  return pi;
}
 
int main() {
  cin.tie(nullptr)->sync_with_stdio(false);
  string A, B;
  cin >> A >> B;
  tuple<int, int, int> ans = {0, 0, 0};
  for (int r = 0; r < 2; r++) {
    string S = A + "#" + B, T = B + "#" + A;
    for (int i = 0; i < (int)A.size(); i++) {
      vector<int> sPi = prefix_function(S.substr(i, S.size() - i));
      reverse(sPi.begin(), sPi.end());
      for (int j = 0; j < i; j++) {
        sPi.push_back(0);
      }
      reverse(sPi.begin(), sPi.end());
      string tt = T;
      tt = tt.substr(0, B.size() + i + 1);
      reverse(tt.begin(), tt.end());
      vector<int> tPi = prefix_function(tt);
      reverse(tPi.begin(), tPi.end());
      for (int j = 0; j < (int)B.size(); j++) {
        int rightleft = sPi[A.size() + j];
        int leftright = tPi[j];
        int res = rightleft + leftright, x = i - leftright, y = j - rightleft;
        if (r == 1) {
          y = (int)B.size() - res - y;
        }
        ans = max(ans, {res, x, y});
      }
    }
    reverse(B.begin(), B.end());
  }
  cout << get<0>(ans) << "\n" << get<1>(ans) << " " << get<2>(ans) << "\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...