#include using namespace std; //variabili globali ifstream fin("input.txt"); ofstream fout("output.txt"); int length=0; int num_str_riconosciute=0; int s[10000]; /* int A[1] = {0}; int B[2]= {0, 0}; int C[3]= {0, 1, 0}; int D[3]= {0, 1, 1}; int E[4]= {0, 0, 1, 0}; int F[4]= {0, 1, 0, 1}; int G[4]= {0, 1, 1, 1}; */ int A[1] = {0}; int B[2]= {0, 0}; int C[3]= {0, 0, 1}; int D[3]= {0, 1, 0}; int E[4]= {0, 0, 1, 0}; int F[4]= {0, 1, 0, 0}; int G[4]= {0, 1, 1, 0}; // effettua il confronto tra str e s, carattere per carattere, sull'intervallo impostato bool cmp(int str[4],int a, int b) { for(int i=0; i< b-a+1; i++) if(str[i]!=s[a+i]) return false; return true; } // richiama cmp() in base alla lunghezza dell'intervallo. bool check_str(int a, int b) { switch (b-a+1) { case 1 : return cmp(A,a,b); break; case 2 : return cmp(B,a,b); break; case 3 : return (cmp(C,a,b) || cmp(D,a,b)); break; case 4 : return (cmp(E,a,b) || cmp(F,a,b) || cmp(G,a,b)); break; }; } // ricerca ricorsivamente tutti i possibili messaggi contenuti nel file di input void f(int a, int b) { if(check_str(a,b) ) { // stringa riconosciuta dal linguaggio, passo all'intervallo successivo if(b>=length-1) { // sono arrivato alla fine della stringa con una sequenza corretta num_str_riconosciute++; return; } // ci sono altri caratteri da controllare int c=(b+4 > length-1)? length-1 : b+4; f(b+1 ,c); // mi sposto avanti di un carattere e controllo i successivi tre f(a, b-1); // provo a diminuire la dimensione dell'intervallo } else { // stringa non presente nel linguaggio if((b-a) <=0) { // intervallo nullo, inutile proseguire su questo ramo return; } // assumo che gli intervalli precedenti siano corretti // provo a diminuire la dimensione dell'intervallo f(a, b-1); } } int main() { fin >> length; for(int i=0; i< length; i++) fin >> s[i]; int b=(length >= 4)? 3 : length; // cuore del programma f(0,b); // formatto l'output in modulo 10 o 100, se necessario int out= (num_str_riconosciute < 100 && num_str_riconosciute >=10 )?num_str_riconosciute % 10 : num_str_riconosciute % 100; out= (num_str_riconosciute < 10)? num_str_riconosciute : out; fout << out; fout.flush(); fout.close(); fin.close(); return 0; }