Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include <iostream>
- #include <random>
- #include <cstdlib>
- #include <cassert>
- #include <algorithm>
- #include <cmath>
- #include <set>
- using namespace std;
- mt19937 rnd(12345);
- const int N = 3e5 + 7;
- const unsigned int MOD = 998244353, MOD2 = 2e9+7;
- string s;
- int n,cnt[26][N];
- vector<int> pref_ch[N][26], lst[N][26];
- void precalc() {
- for (char a = 'a'; a <= 'z'; a++) {
- for (int i = 0; i < n; i++) {
- pref_ch[i][a - 'a'].resize('z' - a + 1);
- lst[i][a - 'a'].resize('z' - a + 1);
- }
- for (char b = a + 1; b <= 'z'; b++) {
- int A = a - 'a';
- int B = b - a;
- char last = a;
- if (s[0] == last) {
- pref_ch[0][A][B] = 1;
- last = b;
- lst[0][A][B] = 0;
- }
- else {
- pref_ch[0][A][B] = 0;
- lst[0][A][B] = -1;
- }
- for (int i = 1; i < n; i++) {
- pref_ch[i][A][B] += pref_ch[i - 1][A][B];
- lst[i][A][B] = -1;
- if (s[i] == last) {
- pref_ch[i][A][B]++;
- lst[i][A][B] = i;
- if (last == a) {
- last = b;
- }else {
- last = a;
- }
- }
- }
- int r = -1;
- for (int i = n - 1; i >= 0; i--) {
- if (lst[i][A][B] == -1) {
- lst[i][A][B] = r;
- }
- else {
- r = lst[i][A][B];
- }
- }
- }
- }
- for (char a = 'a'; a <= 'z'; a++) {
- int A = a - 'a';
- if (s[0] == a) {
- cnt[A][0] = 1;
- }
- else {
- cnt[A][0] = 0;
- }
- for (int i = 1; i < n; i++) {
- cnt[A][i] = cnt[A][i - 1];
- if (s[i] == a) {
- cnt[A][i]++;
- }
- }
- }
- }
- bool check(char a, int l, int r) {
- if (r < l) {
- return 0;
- }
- int A = a - 'a';
- if (l == 0) {
- return cnt[A][r] > 0;
- }
- return cnt[A][r] - cnt[A][l - 1] > 0;
- }
- int Get(char a, char b, int l, int r) {
- int A = a - 'a';
- int B = b - a;
- if (l == 0) {
- return pref_ch[r][A][B];
- }
- return pref_ch[r][A][B] - pref_ch[l - 1][A][B];
- }
- bool Less(char a, char b, char a1, char b1) {
- if (a == a1) {
- return b < b1;
- }
- return a < a1;
- }
- signed main()
- {
- #ifdef _DEBUG
- freopen("input.txt", "r", stdin);
- #else
- ios::sync_with_stdio(false);
- cin.tie(0);
- #endif
- cin >> s;
- n = s.size();
- precalc();
- int q;
- cin >> q;
- for (int I = 0; I < q; I++) {
- int l, r;
- cin >> l >> r;
- l--;
- r--;
- int answ = -1;
- char a1 = 'E', b1 = 'R';
- for (char a = 'a'; a <= 'z'; a++) {
- int A = a - 'a';
- for (char b = a + 1; b <= 'z'; b++) {
- int B = b - a;
- if (a != b && check(a, l, r) != 0) {
- int ans = Get(a, b, l, r);
- int r1 = lst[l][A][B];
- if (r1 != -1 && r1 <= r) {
- if (s[r1] == a) { // ab
- if (check(b, l, r1 - 1)) { // stalo ba
- ans++;
- if (ans == answ) {
- if (Less(b, a, a1, b1)) {
- a1 = b;
- b1 = a;
- }
- }
- if (ans > answ) {
- a1 = b;
- b1 = a;
- answ = ans;
- }
- continue;
- }
- if (ans == answ) {
- if (Less(a, b, a1, b1)) {
- a1 = a;
- b1 = b;
- }
- }
- if (ans > answ) {
- a1 = a;
- b1 = b;
- answ = ans;
- }
- }
- else { // ba
- if (check(a, l, r1 - 1)) { // stalo ab
- ans++;
- if (ans == answ) {
- if (Less(a, b, a1, b1)) {
- a1 = a;
- b1 = b;
- }
- }
- if (ans > answ) {
- a1 = a;
- b1 = b;
- answ = ans;
- }
- continue;
- }
- if (ans == answ) {
- if (Less(b, a, a1, b1)) {
- a1 = b;
- b1 = a;
- }
- }
- if (ans > answ) {
- a1 = b;
- b1 = a;
- answ = ans;
- }
- }
- }
- }
- }
- }
- for (char a = 'a'; a <= 'z'; a++) {
- if (check(a, l, r)) {
- int ans = 1;
- char b;
- if (a == 'a') {
- b = 'b';
- }
- else {
- b = 'a';
- }
- if (ans == answ) {
- if (Less(a, b, a1, b1)) {
- a1 = a;
- b1 = b;
- }
- }
- if (ans > answ) {
- a1 = a;
- b1 = b;
- answ = ans;
- }
- }
- }
- cout << answ << " " << a1 << b1 << "\n";
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement