Submission #175763

#TimeUsernameProblemLanguageResultExecution timeMemory
175763Ruxandra985Match (CEOI16_match)C++14
37 / 100
2073 ms9460 KiB
/// oare cat de bine merge in practica?
#include <bits/stdc++.h>

using namespace std;
int s[100010] , sp[100010][30];
char sol[100010];
int ok;
int stk[100010];
int match (int st , int dr){
    int i , elem = 0;
    if (st > dr)
        return 1;
    for (i=0;i<'z' - 'a';i++){
        if (((sp[dr][i] - sp[st-1][i]) & 1) == 1)
            return 0;
    }

    for (i=st;i<=dr;i++){
        if (elem && stk[elem] == s[i])
            elem--;
        else stk[++elem] = s[i];
    }
    return (elem == 0);

}
void solve (int st , int dr){
    int i;
    if (st > dr)
        return;
    if (!ok) /// nu mai are rost
        return;
    /// stii ca pe st pui ( , gaseste i match ul

    for (i = ( ( (dr & 1) != (st & 1) ) ? dr : dr - 1); i >= st + 1 ; i-=2){
        if (match(st + 1 , i - 1) && match(i + 1 , dr))
            break;
    }
    if (i < st + 1){
        ok = 0;
        return;
    }
    else {
        sol[st] = '(';
        sol[i] = ')';
        solve(st + 1 , i - 1);
        solve (i + 1 , dr);
    }
}
int main()
{
    FILE *fin = stdin;
    FILE *fout = stdout;
    int n , i;
    char c;
    c=fgetc(fin);
    n = 0;
    while ( 'a' <= c && c <= 'z' ){
        s[++n] = c-'a';

        for (i=0;i<='z'-'a';i++){
            sp[n][i] = sp[n-1][i] + (s[n] == i);
        }

        c=fgetc(fin);
    }
    ok = 1;
    solve (1 , n);
    if (ok == 0){
        fprintf (fout,"%d\n",-1);
    }
    else {
        for (i=1;i<=n;i++)
            fputc(sol[i],fout);
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...