ABA#9594

ABA (Həll təhlili)

Güman edək ki, s_0s_1...s_{n-1} girişi verilir. Tutaq ki, -cı mövqedən -ci mövqeyə qədər olan hərflərinin sayını saxlayır. isə sözün daxilindəki hərflərinin ümumi sayıdır. O zaman, -dən sonra cnt - l[i] sayda hərfi var.

Əgər hərfi -ci mövqedədirsə, o zaman -nin solunda sayda və sağında (cnt - l[i]) sayda hərfi var. hərfinin -ci mövqedə olduğu alt-ardıcıllıqlarının sayı l[i] \cdot (cnt - l[i])-yə bərabərdir.

Qalır alt-ardıcıllıqlarının sayını hərfinin olduğu mövqelər üçün ümumiləşdirmək.

İkinci həll. Sətiri soldan sağa doğru keçərək hərflərinin sayını dəyişənində saxlayacağıq.

Hər hərfi üçün ilə bitən qədər alt-ardıcıllığı var (hazırda -dən əvvəl tam olaraq qədər var). dəyişənində alt-ardıcıllıqlarının sayını saxlayacağıq. Hər hərfinə görə -a əlavə edilməlidir.

Hər bir hərfi üçün artıq mövcud olan qədər ilə başa çatan alt-ardıcıllıqlar var. dəyişənində alt-ardıcıllıqlarının ümumi sayını saxlayacağıq. Hər hərfi üçün -ya əlavə edilməlidir.

Misal

İkinci misalın üzərindən keçək.

"ABA" alt-ardıcıllıqlarının sayı

1 \cdot 5 + 2 \cdot 4 + 2 \cdot 4 + 2 \cdot 4 = 5 + 8 + 8 + 8 = 29

Gəlin problemə ikinci üsulla həll edərkən dəyişənlərin dəyərlərinə nəzər salaq.

Alqoritmin realizasiyası

Giriş sətiri oxuyuruq.

cin >> s;

Dəyişənlərimizi ilkinləşdiririk.

cnt = 0; len = s.size();
l.resize(len);

Hər bir mövqedə -ə -cı mövqedən -ci mövqeyə qədər olan hərflərin sayını daxil edirik. Dövr bitdikdən sonra -də hərflərin ümumi sayı qalır.

for (i = 0; i < len; i++)
{
  if (s[i] == 'A') cnt++;
  l[i] = cnt;
}

Nəticəni dəyişənində saxlayırıq.

res = 0;

hərfinin olduğu hər bir mövqedə alt-ardıcıllıqlarının sayını hesablayırıq.

for (i = 0; i < len; i++)
  if (s[i] == 'B') res += 1LL * l[i] * (cnt - l[i]);

Nəticəni çap edirik.

cout << res;

Alqoritmin realizasiyası — kombinasiyalı sayma

Giriş sətiri oxuyuruq.

cin >> s;

Dəyişənlərimizi ilkinləşdiririk.

a = ab = aba = 0;

Sətirin hər bir simvolunu yoxlayırıq. Dəyişənlər və -nın dəyərini yeniləyirik.

for (i = 0; i < s.size(); i++) 
  if (s[i] == 'A')
  {
    a++;
    aba += ab;
  }
  else
  if (s[i] == 'B') ab += a;

Nəticəni çap edirik.

cout << aba << endl;

Python realizasiyası

Giriş sətiri oxuyuruq.

s = input()

Dəyişənlərimizi ilkinləşdiririk.

cnt = 0
n = len(s)
l = [0] * n

Hər bir mövqedə -ə -cı mövqedən -ci mövqeyə qədər olan hərflərin sayını daxil edirik. Dövr bitdikdən sonra -də hərflərin ümumi sayı qalır.

for i in range(n):
  if s[i] == 'A':
    cnt += 1
  l[i] = cnt

Nəticəni dəyişənində saxlayırıq.

res = 0

hərfinin olduğu hər bir mövqedə alt-ardıcıllıqlarının sayını hesablayırıq.

for i in range(n):
  if s[i] == 'B':
    res += l[i] * (cnt - l[i])

Nəticəni çap edirik.

print(res)

Python realizasiyası — kombinasiyalı sayma

Giriş sətiri oxuyuruq.

s = input()

Dəyişənlərimizi ilkinləşdiririk.

a = ab = aba = 0

Sətirin hər bir simvolunu yoxlayırıq. Dəyişənlər və -nın dəyərini yeniləyirik.

for c in s:
  if c == 'A':
    a += 1
    aba += ab
  if c == 'B':
    ab += a

Nəticəni çap edirik.

print(aba)