SDistanțe

Time limit: 0.2s Memory limit: 64MB Input: sdistante.in Output: sdistante.out

Definim distanța dintre două șiruri de caractere de aceeași lungime ca fiind numărul minim de caractere ce trebuie modificate (înlocuite fiecare cu câte un alt caracter) în primul șir pentru a obține al doilea șir. Vom nota distanța dintre șirurile aa și bb cu dist(a,b)dist(a, b).

De exemplu, dist(dist(abc, ,\ aaa)=2) = 2 (înlocuim caracterul b cu a, respectiv caracterul c cu a), iar dist(dist(ABC, ,\ abc)=3) = 3 (literele mici se consideră diferite de cele mari).

Definim o subsecvență a unui șir ss de caractere ca fiind un șir format din caractere de pe poziții consecutive din ss. Considerăm două subsecvențe ca fiind distincte dacă încep sau se termină la poziții diferite. Vom nota cu s(i,j)s(i, j) subsecvența formată din caracterele indexate de la ii la jj ale șirului ss. Șirurile se indexează de la 00. Exemplu: pentru șirul s=s = abc subsecvențele sunt s(0,0)=s(0, 0) = a, s(1,1)=s(1, 1) = b, s(2,2)=s(2, 2) = c, s(0,1)=s(0, 1) = ab, s(1,2)=s(1, 2) = bc, s(0,2)=s(0, 2) = abc, iar pentru șirul s=s = aa acestea sunt s(0,0)=s(0, 0) = a, s(1,1)=s(1, 1) = a, s(0,1)=s(0, 1) = aa.

Cerință

Se dă un șir de caractere ss, care poate conține doar litere mici și mari ale alfabetului englez (de la a la z și de la A la Z). Pentru toate perechile neordonate de subsecvențe distincte ale șirului ss care au lungimi egale, vrem să calculăm distanța dintre ele și să afișăm suma acestora mod 109+7\text{mod }10^9 + 7.

Formal, se cere suma valorilor dist(s(a,b),s(c,d))dist(s(a, b), s(c, d)), pentru toți indicii aa, bb, cc, dd cu 0a,b,c,d<s,a<c,ab,cd,ba=dc0 ≤ a, b, c, d < |s|, a < c, a ≤ b, c ≤ d, b − a = d − c, mod 109+7\text{mod }10^9 + 7. s|s| reprezintă lungimea șirului ss, care este indexat de la 00.

Date de intrare

Pe singura linie a fișierului sdistante.in este șirul dat, ss.

Date de ieșire

Se va afișa pe singurul rând al fișierului sdistante.out un număr întreg reprezentând suma distanțelor, mod 109+7\text{mod }10^9 + 7.

Restricții și precizări

  • s4 000 000|s| ≤ 4 \ 000 \ 000, unde s|s| este lungimea șirului ss.
  • Pentru 1111 puncte, s20|s| ≤ 20, ss conține doar litere mici.
  • Pentru alte 5 puncte, s50|s| ≤ 50, ss conține doar caracterele a și b.
  • Pentru alte 15 puncte, s350|s| ≤ 350, ss conține doar litere mici.
  • Pentru alte 6 puncte, s1 000|s| ≤ 1 \ 000, ss conține doar caracterele a și b.
  • Pentru alte 30 puncte, s5 000|s| ≤ 5 \ 000, ss conține doar litere mici.
  • Pentru alte 5 puncte, s100 000|s| ≤ 100 \ 000, ss conține doar caracterele a și b.
  • Pentru alte 4 puncte, s100 000|s| ≤ 100 \ 000, ss conține doar litere mici.
  • Pentru alte 6 puncte, s1 000 000|s| ≤ 1 \ 000 \ 000, ss conține doar caracterele a și b.
  • Pentru alte 18 puncte, fără restricții suplimentare.

Exemplul 1

sdistante.in

abc

sdistante.out

5

Explicație

  • dist(s(0,0),s(1,1))=dist(dist(s(0, 0), s(1, 1)) = dist(a, ,\ b)=1) = 1
  • dist(s(0,0),s(2,2))=dist(dist(s(0, 0), s(2, 2)) = dist(a, ,\ c)=1) = 1
  • dist(s(1,1),s(2,2))=dist(dist(s(1, 1), s(2, 2)) = dist(b, ,\ c)=1) = 1
  • dist(s(0,1),s(1,2))=dist(dist(s(0, 1), s(1, 2)) = dist(ab, ,\ bc)=2) = 2

Exemplul 2

sdistante.in

aab

sdistante.out

3

Explicație

  • dist(s(0,0),s(1,1))=dist(dist(s(0, 0), s(1, 1)) = dist(a, ,\ a)=0) = 0
  • dist(s(0,0),s(2,2))=dist(dist(s(0, 0), s(2, 2)) = dist(a, ,\ b)=1) = 1
  • dist(s(1,1),s(2,2))=dist(dist(s(1, 1), s(2, 2)) = dist(a, ,\ b)=1) = 1
  • dist(s(0,1),s(1,2))=dist(dist(s(0, 1), s(1, 2)) = dist(aa, ,\ ab)=1) = 1

Exemplul 3

sdistante.in

ABa

sdistante.out

5

Explicație

  • dist(s(0,0),s(1,1))=dist(dist(s(0, 0), s(1, 1)) = dist(A, ,\ B)=1) = 1
  • dist(s(0,0),s(2,2))=dist(dist(s(0, 0), s(2, 2)) = dist(A, ,\ a)=1) = 1
  • dist(s(1,1),s(2,2))=dist(dist(s(1, 1), s(2, 2)) = dist(B, ,\ a)=1) = 1
  • dist(s(0,1),s(1,2))=dist(dist(s(0, 1), s(1, 2)) = dist(AB, ,\ Ba)=2) = 2

Exemplul 4

sdistante.in

aaaaabbbaaaa

sdistante.out

480

Exemplul 5

sdistante.in

abcdefghizabcdefghiz

sdistante.out

7095

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