Rezolvare completă PbInfo #2246 adobe

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 ***++.

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema adobe:

#include <bits/stdc++.h>
using namespace std;

string S;
int A,D,O,B,E,V,C,J,n,L,R,sol;
inline void proces(char);
inline void unproces(char);
inline int analiza(int,int,int,int,int,int,int,int);
int main()
{
    cin>>S;
    n=S.size();
    if(n<5)
    {
        cout<<"0\n";
        return 0;
    }
    for(R=0;R<5;R++)
        proces(S[R]);
    for(R=4;;)
    {
        sol+=analiza(A,D,O,B,E,V,C,J);
        R++;
        if(R==n)break;
        proces(S[R]);
        unproces(S[L]);
        L++;

    }
    cout<<sol;
    return 0;
}
inline void proces(char c)
{
    if(c=='a'||c=='A'){A++;return;}
    if(c=='d'||c=='D'){D++;return;}
    if(c=='o'||c=='O'){O++;return;}
    if(c=='b'||c=='B'){B++;return;}
    if(c=='e'||c=='E'){E++;return;}
    if(c=='-'){V++;return;}
    if(c=='+'){C++;return;}
    if(c=='*'){J++;return;}
}
inline void unproces(char c)
{
    if(c=='a'||c=='A'){A--;return;}
    if(c=='d'||c=='D'){D--;return;}
    if(c=='o'||c=='O'){O--;return;}
    if(c=='b'||c=='B'){B--;return;}
    if(c=='e'||c=='E'){E--;return;}
    if(c=='-'){V--;return;}
    if(c=='+'){C--;return;}
    if(c=='*'){J--;return;}
}
inline int analiza(int a,int d,int o,int b,int e,int v,int c,int j)
{
    if(a+v+j==0)return 0;if(a)a--;else if(v)v--;else j--;
    if(o+v+j==0)return 0;if(o)o--;else if(v)v--;else j--;
    if(e+v+j==0)return 0;if(e)e--;else if(v)v--;else j--;
    if(b+c+j==0)return 0;if(b)b--;else if(c)c--;else j--;
    if(d+c+j==0)return 0;if(d)d--;else if(c)c--;else j--;
    return 1;
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #2246 adobe

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2246 adobe de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!