Pagini recente » Cod sursa (job #922202) | Cod sursa (job #366519) | Cod sursa (job #1015312) | Cod sursa (job #2311487) | Cod sursa (job #900154)
Cod sursa(job #900154)
# include <fstream>
# include <vector>
# include <algorithm>
using namespace std ;
ifstream in ( "nrcuv.in" ) ;
ofstream out ( "nrcuv.out" ) ;
const int nMax = 1002 ;
int n , m , v [ nMax ] [ 27 ] ;
vector < int > nu [ 27 ] ;
struct douaelem
{
int a , b ;
} lista [ 2002 ] ;
bool comp ( douaelem x , douaelem y )
{
if ( x . a == y . a )
{
return x . b < y . b ;
}
return x . a < y . a ;
}
void scan ( )
{
in >> n >> m ;
char aux , x , y ;
for ( int i = 1 ; i <= m ; ++ i )
{
in >> x >> y ;
if ( x > y )
{
aux = x ;
x = y ;
y = aux ;
}
lista [ i ] . a = x - 'a' + 1 ;
lista [ i ] . b = y - 'a' + 1 ;
}
sort ( lista + 1 , lista + m + 1 , comp ) ;
for ( int i = 1 , a , b ; i <= m ; ++ i )
{
if ( lista [ i ] . a == lista [ i - 1 ] . a && lista [ i ] . b == lista [ i - 1 ] . b )
{
continue ;
}
a = lista [ i ] .a ; b = lista [ i ] . b ;
if ( a == b )
{
nu [ a ] . push_back ( b ) ;
continue ;
}
nu [ a ] . push_back ( b ) ;
nu [ b ] . push_back ( a ) ;
}
}
void runTheProgram ( )
{
scan ( ) ;
// v [ i ] [ j ] = nr de cuv cu i litere care se termina in litere mai mici sau egale cu j
for ( int i = 1 ; i <= 26 ; ++ i )
{
v [ 1 ] [ i ] = v [ 1 ] [ i - 1 ] + 26 ;
}
for ( int i = 2 ; i <= n ; ++ i )
{
for ( int j = 1 ; j <= 26 ; ++ j )
{
v [ i ] [ j ] = v [ i - 1 ] [ 26 ] + v [ i ] [ j - 1 ] ;
if ( v [ i ] [ j ] >= 104659 )
{
v [ i ] [ j ] -= 104659 ;
}
for ( size_t k = 0 ; k < nu [ j ] . size ( ) ; ++ k )
{
v [ i ] [ j ] -= v [ i - 1 ] [ nu [ j ] [ k ] ] - v [ i - 1 ] [ nu [ j ] [ k ] - 1 ] ;
// <=> v [ i ] [ j ] - v [ i - 1 ] [ nu [ j ] [ k ] ] + v [ i - 1 ] [ nu [ j ] [ k ] - 1 ]
}
}
}
out << v [ n ] [ 26 ] ;
}
int main ( )
{
runTheProgram ( ) ;
return 0 ;
}