Pagini recente » Cod sursa (job #2893466) | Cod sursa (job #128061) | Cod sursa (job #3140354) | Cod sursa (job #2047252) | Cod sursa (job #2378845)
/// 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;
}