Cod sursa(job #872082)

Utilizator thesilverhand13FII Florea Toma Eduard thesilverhand13 Data 5 februarie 2013 19:13:17
Problema Lista lui Andrei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
 # include <fstream>
 # include <algorithm>
 # include <vector>
 # include <cstring>
 
 # define dim 30
 # define dim2 1005
 # define mod 104659
 
 using namespace std;
 
 ifstream f("nrcuv.in");
 ofstream g("nrcuv.out");
 
 int uz[ dim ][ dim ], dp[ dim2 ][ dim ]; // dp[ i ][ j ] = posibilitatile de a forma un cuvant de lungime i cu primele j litere din alfabet
 int N, M;
 int sol;
 
 void citire()
 {
	 int i;
	 char a, b;
	 f >> N >> M;
	 for ( i = 1 ; i <= M ; i++ )
	 {
		 f >> a >> b;
		 //g << a << " " << b << "\n";
		 uz[ a - 'a' + 1 ][ b - 'a' + 1 ] = 1;
		 uz[ b - 'a' + 1 ][ a - 'a' + 1 ] = 1;
	 }
 }
 
 void rezolva()
 {
	 int i, j, k;
	 for ( i = 1 ; i <= 26 ; i++ )
		 dp[ 1 ][ i ] = 1;   // cu o litera pot forma un singur cuvant,nu?
	 
	 for ( i = 2 ; i <= N ; i++ )
	   for ( j = 1 ; j <= 26 ; j++ )
	     for ( k = 1 ; k <= 26 ; k++ )
			 if ( uz[ j ][ k ] == 0 ) /// daca pot pune litera j langa litera k
				 dp[ i ][ j ] = ( dp[ i ][ j ] + dp[ i - 1 ][ k ] ) % mod; // adun la solutii toate cuvintele formate din i - 1 litere si incep cu litera k
	 for ( i = 1 ; i <= 26 ; i++ )
		 sol  = ( sol + dp[ N ][ i ] ) % mod;
	 g << sol;
 }
 
 int main()
 {
	 citire();
	 rezolva();
	 return 0;
 }