Cod sursa(job #2379707)

Utilizator MoisaRaduMoisa Alin Radu Andru MoisaRadu Data 13 martie 2019 22:21:28
Problema Lista lui Andrei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.58 kb
/// D[i][j] = numarul de cuvinte de lungime i terminate cu litera j (j = 0, 1, 2, ... 25)
/// D[i][j] = suma din D[i-1][k] daca k,j pot fi asa una dupa alta
/// Cum notez ca literele i si j pot sau nu sa se succeada ?
/// O matrice in care A[i][j] = 1 sau 0 dupa cum i,j pot sau nu sa apara una dupa alta in aceasta ordine
#include <fstream>

using namespace std;
int n,m,i,MOD=104659,j,k;
char x,y;
int a[26][26];
int ant[26],crt[26];

int main(){
    ifstream fin ("nrcuv.in");
    ofstream fout("nrcuv.out");
    fin>>n>>m;
    for(i=1;i<=m;i++){
        fin>>x>>y;
        a[y-'a'][x-'a']=1;
        a[x-'a'][y-'a']=1;
    }
/// in loc sa folosesc matrice cu n linii si 26 de coloane,
/// intrucat datele liniei curente se calculeaza in functie de cele
/// ale liniei anterioare, vom tine doua linii
/// avantaj: nu mai trebuie memorie n*sigma

    for(i=0;i<=25;i++)
        ant[i]=1; /// se numara sirul format doar din litera respectiva
    for(i=2;i<=n;i++){
        /// numaram siruri de lungime i
        for(j=0;j<=25;j++){
            /// numaram siruri de lungime i terminate cu litera j
            crt[j]=0;
            for(k=0;k<=25;k++){
                /// ne gandim ca punem litera j la finalul unui sir
                /// de lungime i-1 terminat cu litera k
                if(a[k][j]!=1){
                    crt[j]+=ant[k];
                    crt[j]%=MOD;
                }
            }
        }
        for(j=0;j<=25;j++)
            ant[j]=crt[j];
    }
    int s=0;
    for(i=0;i<=25;i++)
        s+=ant[i];
    fout<<s%MOD;
    return 0;
}