1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <iostream>
#include <vector>
#include <string>
#include <unordered_map>
#include <algorithm>
using namespace std;

const int MOD = 998244353;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, q;
    cin >> n >> q;
    string s;
    cin >> s;

    // Inicjalizacja mapy do przechowywania liczby wystąpień podciągów
    unordered_map<string, int> podciagi;

    // Funkcja do aktualizacji podciągów po zmianie litery
    auto aktualizujPodciagi = [&](int pozycja, char nowaLitera) {
        // Usuń wpływ starej litery na podciągi
        char staraLitera = s[pozycja - 1];
        s[pozycja - 1] = nowaLitera;

        // Przejdź przez wszystkie możliwe podciągi zawierające tę pozycję
        // i zaktualizuj ich liczbę wystąpień
        // (To jest uproszczone podejście, które może nie być wystarczająco efektywne dla dużych n i q)
        for (int i = 0; i < n; ++i) {
            string podciag;
            for (int j = i; j < n; ++j) {
                podciag += s[j];
                if (podciag.size() > 1 && podciag.find(nowaLitera) != string::npos) {
                    podciagi[podciag]++;
                }
            }
        }
    };

    // Oblicz początkową liczbę podciągów występujących co najmniej dwa razy
    int wynik = 0;
    for (const auto& para : podciagi) {
        if (para.second >= 2) {
            wynik = (wynik + 1) % MOD;
        }
    }
    cout << wynik << '\n';

    // Przetwórz operacje
    for (int i = 0; i < q; ++i) {
        int p;
        char z;
        cin >> p >> z;
        aktualizujPodciagi(p, z);

        // Oblicz liczbę podciągów występujących co najmniej dwa razy
        wynik = 0;
        for (const auto& para : podciagi) {
            if (para.second >= 2) {
                wynik = (wynik + 1) % MOD;
            }
        }
        cout << wynik << '\n';
    }

    return 0;
}