Micul String

Time limit: 2s Memory limit: 512MB Input: Output:

Se numește subsecvență a unui șir de caractere ss un șir de caractere tt cu proprietatea că există doi indici ii și jj cu 0ij<s0 \leq i \leq j < |s| astfel încât t=sisi+1si+2...sjt=\overline{s_is_{i+1}s_{i+2}...{s_j}}.

Pentru un tuplu de șiruri de caractere (s0,s1,s2,...,sK1)(s_0, s_1, s_2, ..., s_{K-1}) vom defini f(s0,s1,s2,...,sK1)f(s_0,s_1,s_2,...,s_{K-1}) ca fiind șirul minim lexicografic1^1 ce se poate obține prin următorul procedeu:

  • Pentru fiecare șir sis_i, se alege o subsecvență nevidă tit_i a sa;
  • Se concatenează t0,t1,t2,...,tK1t_0, t_1, t_2,..., t_{K-1}, șirul obținut fiind rezultatul procedeului.

1^1 Un șir de caractere a0a1an1\overline{a_0a_1 \ldots a_{n-1}} este mai mic lexicografic decât un alt șir de caractere b0b1bm1\overline{b_0b_1 \ldots b_{m-1}} dacă și numai dacă:

  • Există un indice ii (0i<min(n,m)0 \le i < \min(n,m)) pentru care a0a1ai1=b0b1bi1\overline{a_0a_1 \ldots a_{i-1}}=\overline{b_0b_1 \ldots b_{i-1}} și ai<bia_i<b_i; sau
  • n<mn<m și a0a1an1=b0b1bn1\overline{a_0a_1 \ldots a_{n-1}}=\overline{b_0b_1 \ldots b_{n-1}}.

Cerință

Se dau un număr natural NN, un șir de caractere de lungime NN, notat ww, un număr natural KK și un șir de KK numere naturale nenule l0,l1,l2,...,lK1l_0, l_1, l_2,..., l_{K-1}. Să se numere câte tupluri de KK șiruri de caractere, (s0,s1,s2,...,sK1)(s_0, s_1, s_2, ..., s_{K-1}) respectă următoarele condiții:

  • Toate șirurile conțin doar litere mici ale alfabetului englez
  • si=li|s_i|=l_i, 1iK\forall 1 \leq i \leq K
  • f(s0,s1,s2,...,sK1)=wf(s_0, s_1, s_2, ..., s_{K - 1})=w

Deoarece acest număr poate fi mare, se cere restul acestuia la împărțirea prin 998 244 353998 \ 244 \ 353.

Detalii de implementare

Concurenții vor avea de implementat o singură funcție:

int solve(int N, int K, std::string w, std::vector<int> l);

care primește ca parametri:

  • NN, numărul de caractere din șirul ww
  • KK, numărul de șiruri dintr-un tuplu
  • Șirul ww (indexat de la 00)
  • ll, reprezentând lungimile șirurilor (indexat de la 00)

Funcția solve va fi apelată o singură dată.

Restricții

  • 1KN2001 \leq K \leq N \leq 200
  • 1li2001 \leq l_i \leq 200, 0iN10 \leq i \leq N - 1
  • Șirul ww este format doar din litere mici ale alfabetului englez
  • Vom considera wiw_i al ii-lea caracter din șirul ww
# Punctaj Restricții
1 7 1KN71\leq K \leq N \leq 7, 0K1li8\sum_0^{K-1}l_i \leq 8 și ww conține doar caracterele a, b, c, d
2 8 1KN251 \leq K \leq N \leq 25 și li=3l_i=3,  0i<N\forall \ 0 \leq i < N
3 11 K=2K=2
4 14 1KN1201 \leq K \leq N \leq 120, 1li1201 \leq l_i \leq 120 și wiwi+1, 0i<N1w_i \leq w_{i+1}, \forall \ 0 \leq i < N - 1 (șirul ww este crescător)
5 23 1KN901\leq K \leq N \leq 90 și 1li901 \leq l_i \leq 90,  0i<N\forall \ 0 \leq i < N
6 21 1KN1501\leq K \leq N \leq 150 și 1li1501 \leq l_i \leq 150,  0i<N\forall \ 0 \leq i < N
7 16 Fără restricții suplimentare.

Exemplul 1

input

4 3
babz
1 2 1

output

1

Explicație

Pentru primul exemplu, singurul tuplu valid este ("b", "ab", "z").

Exemplul 2

input

4 3
babz
1 3 1

output

26

Exemplul 3

input

6 4
abcbzz
3 3 3 3

output

1849

Log in or sign up to be able to send submissions!