ConcursC++17

Anagrame

Se consideră șirul de litere mici ale alfabetului englez A[1],…,A[N]A[1], \ldots, A[N].

Fie succesiunea de caractere alăturate din șir A[x],A[x+1],…,A[y]A[x], A[x + 1],\ldots, A[y], unde 1≤x≤y≤N1 \leq x \leq y \leq N, pe care o notăm cu A[x,y]A[x, y].
Pentru oricare literă mică a alfabetului englez ℓ\ell, definim range(ℓ)\text{range}(\ell) ca fiind 00, dacă ℓ\ell apare cel mult o dată în A[x,y]A[x, y]. Altfel, valoarea range(ℓ)\text{range}(\ell) este egală cu diferența dintre cea mai mare și cea mai mică poziție pe care litera ℓ\ell apare în A[x,y]A[x, y].
Șirul suport asociat lui A[x,y]A[x, y] este șirul de caractere minim lexicografic ce conține fiecare literă ℓ\ell de range(ℓ)\text{range}(\ell) ori.

De exemplu, dacă șirul AA este șirul abdacgacd și considerăm A[3,8]=dacgacA[3, 8] = \texttt{dacgac}, atunci range(a)=5−2=3\text{range}(\texttt{a})=5 - 2 = 3 (pentru că, în A[3,8]A[3, 8], litera a apare pe pozițiile 22 și 55), range(c)=6−3=3\text{range}(\texttt{c})=6-3=3 și range(ℓ)=0\text{range}(\ell) = 0 pentru toate celelalte litere ℓ∈{b,d,e,f,g,…,z}\ell \in \{\texttt{b}, \texttt{d}, \texttt{e}, \texttt{f}, \texttt{g}, \ldots, \texttt{z}\}. Șirul suport asociat lui A[3,8]A[3, 8] este, astfel, aaaccc.

Un șir de caractere S1S_1 este o anagramă a șirului S2S_2 dacă S1S_1 este identic cu S2S_2 sau dacă S1S_1 se poate obține din S2S_2 prin schimbarea ordinii caracterelor. De exemplu, șirul de caractere tamara este o anagramă a șirului armata. Două anagrame se consideră a fi distincte dacă ele diferă în cel puțin o poziție. De exemplu, șirul de caractere aab are trei anagrame distincte: aab, aba, baa.

Asupra șirului se efectuează două tipuri de operații:

  • Actualizare: dându-se litera cc și poziția pozpoz, se înlocuiește A[poz]A[poz] cu cc.
  • Generare: dându-se perechea x,yx, y, se generează șirul suport al lui A[x,y]A[x, y].

Cerință

Problema are două cerințe, cerința de rezolvat fiind dată de C∈{1,2}C \in \{1, 2\}. Pentru ambele cerințe, se dau șirul AA și MM operații care se vor efectua în ordine.
Dacă C=1\bm{C = 1}: determinați șirul suport minim lexicografic dintre cele obținute în urma tuturor operațiilor de generare.
Dacă C=2\bm{C = 2}: pentru fiecare operație de generare dată, determinați numărul de anagrame distincte ale șirului suport obținut, modulo 1 999 999 9731 \ 999 \ 999 \ 973.

Date de intrare

Pe prima linie a fișierului de intrare anagrame.in se află numerele naturale CC, NN și MM, unde CC este numărul cerinței (11 sau 22), iar NN și MM au semnificația din enunț.
Pe a doua linie se află șirul AA, cele NN caractere ale sale nefiind separate prin spații. Pe fiecare dintre următoarele MM linii se află datele care descriu câte o operație:

  • O operație de actualizare este descrisă prin caracterul cc și un număr natural pozpoz, cu semnificația din enunț.
  • O operație de generare este descrisă prin perechea xx, yy de numere naturale, cu semnificația din enunț.

Valorile aflate pe aceeași linie a fișierului de intrare sunt separate prin câte un spațiu.

Date de ieșire

Fișierul de ieșire anagrame.out conține:
Dacă C=1\bm{C = 1}: pe prima linie, șirul suport minim lexicografic cerut la cerința 11.
Dacă C=2\bm{C = 2}: pentru fiecare generare câte o linie, ce conține numărul cerut în cerința 2, în ordinea corespunzătoare generărilor date.

Restricții și precizări

  • 1≤N,M≤100 0001\leq N, M \leq 100 \ 000
  • 1≤x≤y≤N1\leq x \leq y \leq N
  • Se garantează că, pentru oricare operație de generare din testele de evaluare, șirul suport va conține cel puțin un caracter.
  • În cadrul unei actualizări este permisă înlocuirea literei de pe poziția pozpoz cu ea însăși.
  • Șirul de caractere S[1],…,S[k]S[1], \ldots, S[k] este lexicografic mai mic decât șirul T[1],…,T[ℓ]T[1], \ldots, T[\ell] dacă (i)~k<ℓk < \ell și S[i]=T[i]S[i] = T[i] pentru oricare 1≤i≤k1 \leq i \leq k, sau (ii)~există un 1≤i≤min⁡(k,ℓ)1 \leq i \leq \min(k,\ell) astfel încât S[1]=T[1],…,S[i−1]=T[i−1]S[1] = T[1], \ldots, S[i-1] = T[i-1] și S[i]<T[i]S[i]<T[i].
#PunctajRestricții
18C=1C=1; N≤10 000N \leq 10 \ 000; nu există actualizări, iar șirul AA are toate literele identice
216C=1C=1; 1≤N,M≤5001 \leq N, M \leq 500
324C=1C=1; N≤10 000N \leq 10 \ 000; nu există actualizări
412C=1C=1
58C=2C=2; N≤10 000N \leq 10 \ 000; nu există actualizări, iar șirul AA are toate literele identice
612C=2C=2; y−x≤5y-x \leq 5; 1≤M≤501\leq M \leq 50 și 1≤N≤10 0001 \leq N \leq 10 \ 000
78C=2C=2; N≤10 000N \leq 10 \ 000; înainte de toate actualizările și după fiecare actualizare,șirul AA nu va conține alte litere în afară de a și b
812C=2C=2

Exemplul 1

anagrame.in

1 5 5
abcar
b 3
1 4
r 4
r 2
2 4

anagrame.out

aaab

Explicație

După prima actualizare, șirul AA devine abbar. A doua operație este o generare. Șirul suport obținut pentru abba este aaab. După următoarele două actualizări, șirul AA devine arbrr, iar șirul suport pentru rbr corespunzător celei de a doua generări este rr. Șirul suport minim lexicografic dintre cele două obținute este aaab.

Exemplul 2

anagrame.in

2 5 5
abcar
b 3
1 4
r 4
r 2
2 4

anagrame.out

4
1

Explicație

Pentru prima generare (1,4)(1,4) șirul suport obținut este aaab, care are patru anagrame distincte: aaab, aaba, abaa, baaa. După următoarele două operații, șirul suport pentru rbr este rr, care are o singură anagramă.

Sursă și autori

OJI 2025, clasele 10. Daniela Lica.

Enunț din Kilonova, sub licența CC-BY-NC-SA-4.0, conform politicii sursei. Adaptări de prezentare și tipografie. Exemplele, formulele și figurile originale sunt păstrate.

RÂNDUL TĂU

Trimite o soluție

Editor de cod

Setul original de teste și regulile de punctare sunt în curs de verificare. Trimiterea pentru evaluare va fi disponibilă după această verificare.

Se verifică autentificarea…

Un pas, apoi următorul.Înapoi sus ↑