# PBinfo #3293 – bifid – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: Darius

## Enunț

Cerința
În criptografia clasică, cifrul bifid este un cifru ce combină pătratul lui Polybius cu cifrul transpoziţiei şi       foloseşte fracţionarea.

Pentru început, alfabetul este scris amestecat într-un pătrat al lui Polybius:

     1 2 3 4 5
   1 b g w k z
   2 q p n d s
   3 i o a x e
   4 f c l u m
   5 t h y v r
Mesajul este convertit în coordonatele carteziene obişnuite, scrise unele sub altele:     

   a n a a r e m e r e
   3 2 3 3 5 3 4 3 5 3
   3 3 3 3 5 5 5 5 5 5
Sunt apoi citite pe linii:

   3 2 3 3 5 3 4 3 5 3 3 3 3 3 5 5 5 5 5 5
Apoi sunt împărţite în perechi, iar acestea transformate înapoi în litere folosind pătratul:

   32 33 53 43 53 33 33 55 55 55 
   a  n  a  a  r  e  m  e  r  e=> oaylyaarrr
Dându-se numărul c și alfabetul din care lipsește o literă se cere:


pentru c=1 se dă un mesaj ce trebuie codificat;
pentru c=2 se dă mesajul codificat și trebuie decodificat;

Date de intrare
Fișierul de intrare bifid.in conține pe prima linie numărul c și pe următoarele 5 linii câte 5 litere care alcătuiesc un alfabet din care lipsește o literă. Pe următoarea linie se dă un mesaj alcătuit din litere mici.

Date de ieșire
Fișierul de ieșire bifid.out va conține pe prima linie mesajul codificat, dacă c=1, sau mesajul decodificat, dacă c=2.

Restricții și precizări

mesajul și alfabetul conțin numai litere mici ale alfabetului englez
1 ≤ lungimea șirului ≤ 10000

Exemplul 1:
bifid.in

1
bgwkz
qpnds
ioaxe
fclum
thyvr
anaaremere
bifid.out

oaylyaarrr
Exemplul 2:
bifid.in

2
bgwkz
qpnds
ioaxe
fclum
thyvr
oaylyaarrr
bifid.out

anaaremere
Explicație
Tabelul din exemple corespunzător șirului este acesta:

#	1	2	3	4	5
1	b	g	w	k	z
2	q	p	n	d	s
3	i	o	a	x	e
4	f	c	l	u	m
5	t	h	y	v	r

## Cod sursă C++

```cpp
#include <fstream>
using namespace std;
int v[130];
char v2[130];
int v3[40005];
char cod[40005];
int v4[40005];
int main()
{
    ifstream cin ("bifid.in");
    ofstream cout ("bifid.out");
    int c;
    cin>>c;
    if(c==1)
    {
        char s;
        for(int i=1;i<=5;i++)
        {
            for(int j=1;j<=5;j++)
            {
                cin>>s;
                v[s]=i*10+j;
                v2[i*10+j]=s;
            }
        }
        char c;
        int cnt=0;
        while(cin>>c)
        {
            cnt++;
            cod[cnt]=c;
        }
        int cnt1=0;
        for(int i=1;i<=cnt;i++)
        {
            cnt1++;
            v3[cnt1]=v[cod[i]]/10;
        }
        for(int i=1;i<=cnt;i++)
        {
            cnt1++;
            v3[cnt1]=v[cod[i]]%10;
        }
        for(int i=1;i<cnt1;i+=2)
        {
            cout<<v2[v3[i]*10+v3[i+1]];
        }
    }
    else
    {
        char s;
        for(int i=1;i<=5;i++)
        {
            for(int j=1;j<=5;j++)
            {
                cin>>s;
                v[s]=i*10+j;
                v2[i*10+j]=s;
            }
        }
        char c;
        int cnt=0,cnt1=0;
        while(cin>>c)
        {
            cnt++;
            cod[cnt]=c;
            cnt1++;
            v4[cnt1]=v[cod[cnt]]/10;
            cnt1++;
            v4[cnt1]=v[cod[cnt]]%10;
        }
        for(int i=1;i<=cnt;i++)
        {
            cout<<v2[v4[i]*10+v4[i+cnt]];
        }
    }
    return 0;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/3293)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/3293/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-3293/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
