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ı
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] * nHə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] = cntNəticəni dəyişənində saxlayırıq.
res = 0hə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 = 0Sə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 += aNəticəni çap edirik.
print(aba)