제출 #175980

#제출 시각아이디문제언어결과실행 시간메모리
175980Ruxandra985괄호 문자열 (CEOI16_match)C++14
100 / 100
33 ms22136 KiB
#include <bits/stdc++.h>
using namespace std;
int sp[30][100010] , go[30][100010];
char sol[100010] , s[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[i][dr] - sp[i][st-1]) & 1) == 1)
            return 0;
    }

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

}
void solve (int st , int dr){
    int i , small;

    if (st > dr)
        return;
    /// stii ca pe st pui ( , gaseste i match ul
    if (s[st] == s[dr])
        i = dr;
    else i = go[s[st]][dr];

    sol[st] = '(';
    sol[i] = ')';
    solve(st + 1 , i - 1);
    solve (i + 1 , dr);
}
int main()
{
    FILE *fin = stdin;
    FILE *fout = stdout;
    int n , i , x;
    fgets (s+1 , 100010 , fin);

    n = 0;
    while ( 'a' <= s[n+1] && s[n+1] <= 'z' ){
        n++;
        s[n]-='a';

        for (i=0;i<='z'-'a';++i){
            sp[i][n] = sp[i][n-1] + (s[n] == i);
        }
    }
    stk[0] = -1;
    if (!match(1 , n)){
        fprintf (fout,"-1");
        return 0;
    }
    for (i = 1; i <= n ; i++){

        if (i-1 && s[i-1] == s[i])
            x = i - 2;
        else x = go[s[i]][i-1] - 1;


        for (int j = 0 ; j <= 'z' - 'a' ; j++){
            if (j == s[x] && x)
                go[j][i] = x;
            else if (x >=0)
                go[j][i] = go[j][ x ];
        }
    }
    ok = 1;
    solve (1 , n);
    fputs (sol+1,fout);
    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

match.cpp: In function 'void solve(int, int)':
match.cpp:32:22: warning: array subscript has type 'char' [-Wchar-subscripts]
     else i = go[s[st]][dr];
                      ^
match.cpp:25:13: warning: unused variable 'small' [-Wunused-variable]
     int i , small;
             ^~~~~
match.cpp: In function 'int main()':
match.cpp:64:25: warning: array subscript has type 'char' [-Wchar-subscripts]
         else x = go[s[i]][i-1] - 1;
                         ^
match.cpp:44:11: warning: ignoring return value of 'char* fgets(char*, int, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
     fgets (s+1 , 100010 , fin);
     ~~~~~~^~~~~~~~~~~~~~~~~~~~
In file included from /usr/include/stdio.h:936:0,
                 from /usr/include/c++/7/cstdio:42,
                 from /usr/include/x86_64-linux-gnu/c++/7/bits/stdc++.h:46,
                 from match.cpp:1:
In function 'char* fgets(char*, int, FILE*)',
    inlined from 'int main()' at match.cpp:44:11:
/usr/include/x86_64-linux-gnu/bits/stdio2.h:261:58: warning: call to '__fgets_chk_warn' declared with attribute warning: fgets called with bigger size than length of destination buffer
  return __fgets_chk_warn (__s, __bos (__s), __n, __stream);
                                                          ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...