lunedì 31 marzo 2014

[C++] Criptografia

La password di questo laboratorio è una stringa di N caratteri minuscoli, alquanto semplice da ricordare ma dato che ci sono molti assistenti tecnici in questa scuola è stato deciso di scriverla in un foglio. Pessima idea! La stringa criptata è finita nelle mani di Edoardo! Sara in grado il giovane studente di decifrarla ed ottenere l’accesso alle preziosissime cartelle sul server?
La stringa criptata è una stringa di L caratteri minuscoli dell’alfabeto latino ed ha la caratteristica di essere palindroma, si può quindi leggere da destra verso sinistra e viceversa senza che cambi. All’ interno di questa stringa alcune lettere sono state sostituite da delle cifre  comprese tra 0 e N-1. La password può essere ricostruita se e solo se tutte le N cifre distinte hanno una corrispondenza con una lettera mantenendo la stringa palindroma.
Scrivi un programma che dato N, L e la stringa criptata ricostruisca la corrispondenza cifra-carattere
La password viene ottenuta concatenando in ordine i caratteri delle corrispondenze

Input
Il programma deve leggere da un file di nome ‘input.txt’. Nella prima riga sono presenti due interi separati da uno spazio: N e L, rispettivamente il numero di cifre incognite e il numero di caratteri della stringa. Nella seconda riga è presente ls stringa di L caratteri senza spazi.

Output
Il programma deve scrivere in un file di nome ‘output.txt’. Deve venire stampata la stringa ‘impossibile’ se non esiste una corrispondenza cifra-carattere 0 se ne esistono molteplici. Altrimenti stampare nel file una stringa di N caratteri: la password decodificata.

Assunzioni
0 < N <= 10
2 <= L <= 200.000 (un caso con L = 50.000.000)
0 <= i < N
L è pari

Esempio
inputfl.txt                     outputflcxt
2  10                            nw
01lrbbrlwn
inputfl.txt                     output .txt
1  10                            impossibile
ebg00hdgbe
inputfl.txt                    output.txt
1  10                           impossibile
 0VWqttqWV0

Note
Nel secondo caso non esiste una corrispondenza per la cifra 0. Nel terzo invece ne esistono molteplici.

Qui basta scorrere e sostituire n volte la stringa. Se non ci sono lacune corrispondenze stampare "imossibile"

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <string>
#define no "impossibile";

using namespace std;

int main()
{ ifstream in("input.txt");
  ofstream out("output.txt");
  
int n,l,j=0,k,f,sl,si;
string s;
bool iff =true;

in>> n>>l>>s;
sl=s.length();

char vect[n];

for (int i=0; i< sl;i++){
    si=s[i];
    k =  si - '0';
    f =s[sl-1-i];
    if ( isdigit(s[i])&& k ==j){
         if (isdigit(f))
         iff=false;
          for (int i=0;i<sl;i++)
              if(s[i]== si)
                        s[i]=f;
          vect[j++] = f;
       }}
       
for (int i=0; i< s.length();i++)
    if (s[i] != s[s.length()-1-i])
       iff=false;
       
if (iff)
for (int i=0; i< n;i++)
out << vect[i];
else
out<<no;


    return 0;
}

Nessun commento:

Posta un commento

Si prega di non commentare in modo volgare e/o offensivo.