fbpx

Problema #626 – Anagrame2 – Rezolvari PBInfo

de Mihai-Alexandru

Călin a primit de la învățătorul lui un exerciţiu pentru a-i testa atenția și rapiditatea. Având un șir de caractere, litere ale alfabetului englez și un cuvânt, Călin trebuie să afle care este prima anagramă (un cuvânt c1 este anagramă pentru alt cuvânt c2 dacă schimbând ordinea literelor lui c1 se obține c2) a cuvântului în șir și câte anagrame sunt. Călin, fiind pasionat de informatică dorește să rezolve această problemă printr-un program.

Cerința

Cunoscând șirul de caractere și cuvântul se cere:

a) să se afișeze prima anagramă a cuvântului în șir;

Călin a primit de la învățătorul lui un exerciţiu pentru a-i testa atenția și rapiditatea. Având un șir de caractere, litere ale alfabetului englez și un cuvânt, Călin trebuie să afle care este prima anagramă (un cuvânt c1 este anagramă pentru alt cuvânt c2 dacă schimbând ordinea literelor lui c1 se obține c2) a cuvântului în șir și câte anagrame sunt. Călin, fiind pasionat de informatică dorește să rezolve această problemă printr-un program.

Cerința

Cunoscând șirul de caractere și cuvântul se cere:

a) să se afișeze prima anagramă a cuvântului în șir;
b) câte anagrame ale cuvântului sunt.

Date de intrare

Fişierul de intrare anagrame2.in conţine pe prima linie un număr natural p. Pentru toate testele de intrare, numărul p poate avea doar valoarea 1 sau valoarea 2. Pe a doua linie se află șirul de caractere, litere ale alfabetului englez. Pe următoarea linie se află cuvântul din enunț.

Date de ieșire

Dacă valoarea lui p este 1, se va rezolva numai punctul a) din cerință. În acest caz, în fişierul de ieşire anagrame2.out se va scrie prima anagramă a cuvântului în șir.

Dacă valoarea lui p este 2, se va rezolva numai punctul b) din cerință. În acest caz, în fișierul de ieșire anagrame.out se va scrie un număr natural reprezentând numărul de anagrame găsite în șir.

Restricții și precizări

  • 1 ≤ Lungime șir ≤ 100.000
  • 1 ≤ Lungime cuvânt ≤ 25.000
  • Există tot timpul cel puțin o anagramă a cuvântului în șir.
  • Pentru rezolvarea corectă a primei cerinţe se acordă 20 de puncte, iar pentru cerința a doua se acordă 80 de puncte.

Exemplul 1:

anagrame2.in

1
anabnaacdRaanaSA
ana

anagrame2.out

ana

Explicație

p = 1

Prima anagramă a cuvântului în șir este ana.

Atenție! Pentru acest test se rezolvă doar cerința a).

Exemplul 2:

anagrame2.in

2
anabnaacdRaanaSA
ana

anagrame2.out

4

Explicație

p = 2

Sunt 4 anagrame ale cuvântului ana în șir: ana, naa, aan, ana.

Atenție! Pentru acest test se rezolvă doar cerința b).

#include <bits/stdc++.h>

using namespace std;

ifstream cin("anagrame2.in");
ofstream cout("anagrame2.out");

char s[100001] , cuv[25000];
int f1[200] , f2[200];

bool egale()
{
    for(int i = 63 ; i <= 125 ; ++i)
        if(f1[i]!=f2[i])
            return 0;
    return 1;
}

int main()
{
    int c;
    cin >> c;
    cin >> s;
    cin >> cuv;
    if(c==2)
    {
        for(int j = 0 ; j < strlen(cuv) ; ++j)
            f1[(int)cuv[j]]++;
        for(int i = 0 ; i < strlen(cuv) ; ++i)
            f2[(int)s[i]]++;
        int cnt=0;
        int i = strlen(cuv);
        if(egale())
                cnt++;
        while(s[i]!='\0')
        {
            f2[(int)s[i-strlen(cuv)]]--;
            f2[(int)s[i]]++;
            if(egale())
                cnt++;
            i++;
        }
        cout << cnt;
    }
    else
    {
        for(int j = 0 ; j < strlen(cuv) ; ++j)
            f1[(int)cuv[j]]++;
        for(int i = 0 ; i < strlen(cuv) ; ++i)
            f2[(int)s[i]]++;
        int cnt=0;
        int i = strlen(cuv);
        if(egale())
                {
                    for(int j = i - strlen(cuv)+1 ; j < i+1 ; ++j)
                        cout << s[j];
                }
            else
        while(s[i]!='\0')
        {
            f2[(int)s[i-strlen(cuv)]]--;
            f2[(int)s[i]]++;
            if(egale())
                {
                    for(int j = i - strlen(cuv)+1 ; j <= i ; ++j)
                        cout << s[j];
                    break;
                }
            i++;
        }
    }
    return 0;
}
Comentarii

S-ar putea sa iti placa