Submission #1264073

#TimeUsernameProblemLanguageResultExecution timeMemory
1264073rtriNecklace (Subtask 1-3) (BOI19_necklace1)C++20
0 / 85
1596 ms576 KiB
#include <bits/stdc++.h>
using namespace std;

string sub(string str, int start, int len) {
  int sz = min(len, (int)str.size() - start);
  return str.substr(start, sz) + str.substr(0, max(0, len - sz));
}

string normalize(string str) {
  int best = 0;
  for (int i = 1; i < str.size(); i++) {
    int best_chr, my_chr, idx = 0;
    bool better = false;
    do {
      best_chr = str[(best + i) % str.size()];
      my_chr = str[(idx + i) % str.size()];
      if (my_chr > best_chr)
        better = true;
      idx++;
    } while (best_chr == my_chr);

    if (!better)
      continue;

    best = i;
  }
  return sub(str, best, str.size());
}

int main() {
  string jill, jane;
  cin >> jill >> jane;

  unordered_map<string, int> jane_substr;
  for (int start = 0; start < jane.size(); start++)
    for (int len = 1; len <= jane.size(); len++) {
      string substr = sub(jane, start, len);
      substr = normalize(substr);
      jane_substr.insert({substr, start});
      reverse(substr.begin(), substr.end());
      substr = normalize(substr);
      jane_substr.insert({substr, start});
    }

  int best = 0;
  pair<int, int> bestsol;
  for (int start = 0; start < jill.size(); start++)
    for (int len = best + 1; len <= jill.size(); len++) {
      string substr = sub(jill, start, len);

      if (jane_substr.count(substr)) {
        best = len;
        bestsol = {start, jane_substr[substr]};
      }
    }

  cout << best << endl;
  cout << bestsol.first << " " << bestsol.second << endl;

  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...