Pagini recente » Cod sursa (job #2131606) | Cod sursa (job #2084676) | Cod sursa (job #2808472) | Cod sursa (job #3255741) | Cod sursa (job #2379707)
/// 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;
}