Cod sursa(job #2320247)

Utilizator DanSDan Teodor Savastre DanS Data 14 ianuarie 2019 15:53:12
Problema Lista lui Andrei Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

ifstream in("nrcuv.in");
ofstream out("nrcuv.out");

const int MAX = 2001;
const int LITERE = 26;
const int MOD = 104659;
int n, m, ans = 0, d[LITERE][LITERE];

struct vect{
    char a;
    char b;
} v[MAX];


bool compare(vect i, vect j)
{
    if(i.a < j.a)
        return true;
    if(i.a == j.a && i.b < j.b)
        return true;
    return false;
}

void init()
{
    for(int i=1; i<=LITERE; i++)
        d[1][i] = 1;
}

bool compatibil(char c1, char c2)
{
    for(int i=1; i<=m; i++)
    {
        if(v[i].a == c1 && v[i].b == c2)
            return false;
        if(v[i].a == c2 && v[i].b == c1)
            return false;
    }
    return true;
}

int main()
{
    in>>n>>m;
    for(int i=1; i<=m; i++)
        in>>v[i].a>>v[i].b;
    //sort(v+1, v+m+1, compare);
    init();
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=LITERE; j++)
        {
            char current = j + 96;
            for(int k = 1; k<=LITERE; k++)
            {
                char c = k + 96;
                if(compatibil(current, c))
                {
                    d[i][j]+=d[i-1][k];
                }
                //cout<<current<<' '<<c<<" -> "<<compatibil(j, k+96)<<'\n';
            }
            //out<<d[i][j]<<' ';
            if( i == n ) ans += d[i][j];
        }
        //out<<'\n';
    }

    out<<ans;
    return 0;
}