Cod sursa(job #900154)

Utilizator toniobFMI - Barbalau Antonio toniob Data 28 februarie 2013 17:57:38
Problema Lista lui Andrei Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.21 kb
# 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 ;
}