Domnul Eboda dorește să se angajeze la firma Adobe. La interviu el primește următoarea problemă.
Cerința
Se dă un șir de caractere format din litere și caracterele *, + și -. Domnul Eboda trebuie să determine câte subsecvențe de lungime 5 sunt anagrame ale cuvântului ADOBE. Regulile suplimentare sunt că nu se face distincție între literele mari și cele mici și în plus, caracterul + poate suplini oricare consoană, caracterul - suplinește orice vocală, iar * suplinește orice literă. Cu aceste reguli putem spune că următoarele secvențe de cinci caractere sunt anagrame ale cuvântului adobe: aeobd, dBoAE, db---, Ae-++, *****, ++---, ad*-+.
Date de intrare
Programul citește de la tastatură șirul de caractere.
Date de ieșire
Programul va afișa pe ecran un singur număr natural reprezentând numărul de subsecvențe de lungime 5 care sunt anagrame ale cuvântului ADOBE.
Restricții și precizări
- Șirul va avea cel mult
100 000de caractere și nu conține alte caractere în afara celor precizate în enunț.
Exemplu
Intrare
ebodaE+m***++
Ieșire
4
Explicație
Cele patru subsecvențe sunt: eboda, bodaE, odaE+ și ***++.
#include <bits/stdc++.h>
using namespace std;
char s[100001];
int f1[300] , f2[300];
bool egale(int cnt1 , int cnt2 , int cnt3)
{
bool ok = true;
for(int i = 97 ; i <= 122 ; ++i)
{
if(f1[i]>f2[i])
{
if(i==97 || i==101 || i==105 || i==111 || i==117)
{
if(cnt2)
cnt2--;
else if(cnt3)
cnt3--;
else
return 0;
}
else
{
if(cnt1)
cnt1--;
else if(cnt3)
cnt3--;
else
return 0;
}
}
}
return ok;
}
int main()
{
int cnt1=0 , cnt2=0 , cnt3=0;
cin >> s;
int i = 0;
f1[97]++;
f1[100]++;
f1[111]++;
f1[98]++;
f1[101]++;
while(s[i]!='\0')
{
if((int) s[i] < 96 && (s[i]!='+' && s[i]!='-' && s[i]!='*'))
s[i]=(char)((int)s[i]+32);
++i;
}
i=0;
int cnt = 0;
for(i = 0 ; i < 5 ; ++i)
{
if(s[i]!='+' && s[i]!='-' && s[i]!='*')
f2[(int)s[i]]++;
else
{
if(s[i]=='+')
cnt1++;
else if(s[i]=='-')
cnt2++;
else
cnt3++;
}
}
if(egale(cnt1 , cnt2 , cnt3))
{
cnt++;
}
while(s[i]!='\0')
{
if(s[i-5]!='+' && s[i-5]!='-' && s[i-5]!='*')
f2[(int)s[i-5]]--;
else
{
if(s[i-5]=='+')
cnt1--;
else if(s[i-5]=='-')
cnt2--;
else
cnt3--;
}
if(s[i]!='+' && s[i]!='-' && s[i]!='*')
f2[(int)s[i]]++;
else
{
if(s[i]=='+')
cnt1++;
else if(s[i]=='-')
cnt2++;
else
cnt3++;
}
if(egale(cnt1 , cnt2 , cnt3))
{
cnt++;
}
i++;
}
cout << cnt;
return 0;
}