Cod sursa(job #2266074)

Utilizator Coroian_DavidCoroian David Coroian_David Data 22 octombrie 2018 10:30:34
Problema Perb Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <bits/stdc++.h>

#define MAX_N 600

#define MAX_CHR 4
#define MAX_CHAR 26

using namespace std;

const int sqrInf = (1e9) - 1;

ifstream f("perb.in");

string s;

int n, m;

int v[MAX_N + 1];
int dp[MAX_N + 1][MAX_N + 1];

int ap[MAX_N + 1][MAX_CHR + 1];
int mx[MAX_N + 1];
int cod[MAX_CHAR + 1];

void readFile()
{
    f >> n >> m;

    f >> s;
}

void init0()
{
    int i, j;
    for(i = 1; i <= n; i ++)
    {
        for(j = i + 1; j <= n; j ++)
            dp[i][j] = sqrInf;
    }
}

void solve()
{
    init0();

    cod['A' - 'A'] = 1;
    cod['C' - 'A'] = 2;
    cod['G' - 'A'] = 3;
    cod['T' - 'A'] = 4;

    int i, j, t;
    for(i = 0; i < n; i ++)
        v[i + 1] = cod[s[i] - 'A'];

    for(t = 1; t < n; t ++)
    {
        for(i = 1; i + (t << 1) - 1 <= n; i ++)
        {
            int cost = 0;
            for(int h = 1; h <= t; h ++)
            {
                ap[h][1] = ap[h][2] = ap[h][3] = ap[h][4] = 0;
                mx[h] = 0;
            }

            for(j = i; j <= n; j ++)
            {
                int poz = j - i + 1;
                int per = (poz % t != 0 ? poz % t : t);

                ap[per][v[j]] ++;

                if(mx[per] == v[j])
                    cost ++;

                else
                    if(ap[per][v[j]] > ap[per][mx[per]])
                    {
                        cost -= ap[per][mx[per]];
                        cost += ap[per][v[j]];
                        mx[per] = v[j];
                    }

                if(per == t && poz >= (t << 1))
                    dp[i][j] = min(dp[i][j], poz - cost);
            }
        }
    }
}

void printFile()
{
    ofstream g("perb.out");

    while(m > 0)
    {
        m --;

        int a, b;
        f >> a >> b;
        g << dp[a][b] << "\n";
    }

    g.close();
}

int main()
{
    readFile();

    solve();

    printFile();

    return 0;
}