Cod sursa(job #992215)

Utilizator vendettaSalajan Razvan vendetta Data 1 septembrie 2013 14:45:14
Problema Seif Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <set>
#include <queue>
#include <deque>

using namespace std;

ifstream f("seif.in");
ofstream g("seif.out");

#define ll long long
#define pb push_back
#define mp make_pair
#define sz size
#define x first
#define y second

#define nmax 1005
#define sigma 27
#define inf (1<<29)

string A, B;
int nextA[nmax][sigma], nextB[nmax][sigma];
int K;

void citeste(){
    f >> K;f.get();
    getline(f, A);
    getline(f, B);
}

void bagaNext(int next[nmax][sigma], string S, int n){
    for(int i='A'-'A'; i<='Z'-'A'; ++i) next[n][i] = n;
    for(int i=n-1; i>=0; --i){
        for(int lit='A'-'A'; lit<='Z'-'A'; ++lit){
            next[i][lit] = next[i+1][lit];
        }
        next[i][ S[i]-'A' ] = i;
    }
}

void aflaSol(int cnt, int pozA, int pozB, int n, int m){
    if (pozA != -1 && pozB != -1){
        g << A[pozA];
    }

    for(int lit='Z'-'A'; lit>='A'-'A'; --lit){
        int newPozA = nextA[pozA+1][lit];
        int newPozB = nextB[pozB+1][lit];
        if (newPozA == n || newPozB == m) continue;
        if (cnt + min( n-newPozA, m-newPozB ) >= K ){
            aflaSol(cnt+1, newPozA, newPozB, n, m);
            break;
        }
    }
}

void preproces(){
    int n = A.sz(); int m = B.sz();
    bagaNext(nextA, A, n);
    bagaNext(nextB, B, m);
    aflaSol(0, -1, -1, n, m);
}

void rezolva(){
    preproces();
}

int main(){
    int t =0; f >> t;
    for(; t; --t){
        citeste();
        rezolva();
        g << "\n";
    }
    f.close();
    g.close();

    return 0;
}