fbpx

Problema #2246 – adobe – Rezolvari PBInfo

de Mihai-Alexandru

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 000 de 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;
}
Comentarii

S-ar putea sa iti placa