3889 - Cnt Subsir Max

From Bitnami MediaWiki

Cerinţa[edit | edit source]

Felicia este interesată de subșirul maxim lexicografic al unui șir de caractere. Rețineți că un șir a este considerat mai mic în ordine lexicografică decât un șir b dacă a este prefix al lui b, sau dacă există o poziție i pentru care avem a[1] = b[1], ..., a[i − 1] = b[i − 1], și a[i] < b[i]. Astfel, subșirul maxim lexicografic al unui șir de caractere este cel mai mare subșir, în ordinea lexicografică, al unui șir de caractere (de exemplu zzxx pentru azbxazbxaax). Pentru un șir s de caractere vom nota cu m(s) subșirul maxim lexicografic al lui s, și cu v(s) = |m(s)| lungimea acestui subșir. Felicia vă dă un șir s format din caractere mici ale alfabetului englez. Considerați toate subsecvențele continue s' ale lui s. Felicia vrea să calculați suma valorilor v(s') pentru toate subsecvențele posibile s' amintite anterior.

Date de intrare[edit | edit source]

Pe singura linie citită de la tastatură se va găsi șirul s.

Date de ieșire[edit | edit source]

Să se afișeze suma cerută, modulo 109+7.

Restricţii şi precizări[edit | edit source]

  • 1≤N≤106

Subtask[edit | edit source]

  • N≤15

Subtask[edit | edit source]

  • N≤200

Subtask[edit | edit source]

  • N≤2000

Subtask[edit | edit source]

  • N≤5⋅104

Subtask[edit | edit source]

  • Fară restricții suplimentare.

Exemplul 1[edit | edit source]

Intrare
 cab
Ieșire
8

Explicație[edit | edit source]

Pentru primul exemplu, observăm că m(c) = c, m(a) = a, m(b) = b, m(ca) = ca, m(ab) = b, m(cab) = cb. Astfel, răspunsul este 1 + 1 + 1 + 2 + 1 + 2 = 8.

Exemplu 2[edit | edit source]

Intrare
 felicia
Ieșire
 59


Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line> MOD = 10**9 + 7

def max_lexicographic(s):

   max_substring = s[0]
   for i in range(1, len(s)):
       if s[i] >= max_substring[0]:
           max_substring = s[i] + max_substring
       else:
           max_substring += s[i]
   return max_substring

def sum_of_max_substrings(s):

   total_sum = 0
   for i in range(len(s)):
       max_substring = max_lexicographic(s[i:])
       total_sum += len(max_substring)
       total_sum %= MOD
   return total_sum

def main():

   s = input().strip()
   result = sum_of_max_substrings(s)
   print(result)

if __name__ == "__main__":

   main()

</syntaxhighlight>