# PBinfo #3671 – Autokey – Rezolvare C++

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

## Enunț

Autokey
Cifrul Autokey este un cifru ce foloseste o matrice cu litere de marimea 26x26 iar liniile si coloanele vor avea asociata o litera (linia si coloana 1 le vom nota cu A, linia si coloana 2 cu B …, linia si coloana 26 cu Z).

Matricea se va forma astfel:


Pe linia 1 se pun literele A, B, C … Z
Pe linia 2 se pun literele B, C, D… Z, A
Pe linia 3 se pun literele C, D, E… Z, A, B
Pe linia 4 se pun literele D, E, F … Z, A, B, C
…
Pe linia 26 se pun literele Z, A, B, C, … Y
Cu alte cuvinte, pentru fiecare linie i (1≤i≤26), se vor lua primele i-1 litere din alfabet si se pun la sfarsitul acestuia.
Cheia o putem considera un vector C care are n litere si incepe de pe pozitia 0 iar mesajul il vom considera un vector M care incepe si el de pe pozitia 0.
Cheia trebuie sa fie mai lunga decat mesajul asa ca acesteia i se va adauga la sfarsit mesajul.
pentru fiecare litera M[i] , afisam litera de pe linia M[i] si coloana C[i] , 0 ≤ i < lungimea mesajului.

Cerința
Dandu-se o cheie si un mesaj, sa se afle cum va arata mesajul dupa o codificare.

Date de intrare
Fișierul de intrare autokey.in conține pe prima linie mesajul si cheia.

Date de ieșire
Fișierul de ieșire autokey.out va conține pe prima linie mesajul dupa o codificare.

Restricții și precizări

1 ≤ lungimea mesajului, lungimea cheii ≤ 10000

Exemplu:
autokey.in

MEETATTHEFOUNTAIN KILT
autokey.out

WMPMMXXAEYHBRYOCA
Explicație
Matricea arata astfel:

#   A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
#   ---------------------------------------------------
A   A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
B   B C D E F G H I J K L M N O P Q R S T U V W X Y Z A
C   C D E F G H I J K L M N O P Q R S T U V W X Y Z A B
D   D E F G H I J K L M N O P Q R S T U V W X Y Z A B C
E   E F G H I J K L M N O P Q R S T U V W X Y Z A B C D
F   F G H I J K L M N O P Q R S T U V W X Y Z A B C D E
G   G H I J K L M N O P Q R S T U V W X Y Z A B C D E F
H   H I J K L M N O P Q R S T U V W X Y Z A B C D E F G
I   I J K L M N O P Q R S T U V W X Y Z A B C D E F G H
J   J K L M N O P Q R S T U V W X Y Z A B C D E F G H I
K   K L M N O P Q R S T U V W X Y Z A B C D E F G H I J
L   L M N O P Q R S T U V W X Y Z A B C D E F G H I J K
M   M N O P Q R S T U V W X Y Z A B C D E F G H I J K L
N   N O P Q R S T U V W X Y Z A B C D E F G H I J K L M
O   O P Q R S T U V W X Y Z A B C D E F G H I J K L M N
P   P Q R S T U V W X Y Z A B C D E F G H I J K L M N O
Q   Q R S T U V W X Y Z A B C D E F G H I J K L M N O P
R   R S T U V W X Y Z A B C D E F G H I J K L M N O P Q
S   S T U V W X Y Z A B C D E F G H I J K L M N O P Q R
T   T U V W X Y Z A B C D E F G H I J K L M N O P Q R S
U   U V W X Y Z A B C D E F G H I J K L M N O P Q R S T
V   V W X Y Z A B C D E F G H I J K L M N O P Q R S T U
W   W X Y Z A B C D E F G H I J K L M N O P Q R S T U V
X   X Y Z A B C D E F G H I J K L M N O P Q R S T U V W
Y   Y Z A B C D E F G H I J K L M N O P Q R S T U V W X
Z   Z A B C D E F G H I J K L M N O P Q R S T U V W X Y
Cheia va fi KILTMEETATTHEFOUNTAIN.
Pentru prima pereche, pe linia M si coloana K se afla litera W.

## Cod sursă C++

```cpp
#include <fstream>
using namespace std;
char v[28][28];
int main()
{
    ifstream cin ("autokey.in");
    ofstream cout ("autokey.out");
    int cnt=0;
    for(char a='A';a<='Z';a++)
    {
        for(char b=a;b<='Z';b++)
        {
            cnt++;
            v[a-'A'+1][cnt]=b;
        }
        for(char b='A';b<a;b++)
        {
            cnt++;
            v[a-'A'+1][cnt]=b;
        }
        cnt=0;
    }
    string cuv,key;
    cin>>cuv>>key;
    key=key+cuv;
    for(int i=0;i<cuv.size();i++)
        cout<<v[cuv[i]-'A'+1][key[i]-'A'+1];
    return 0;
}
```

## Resurse

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