답안 #133302

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
133302 2019-07-20T11:33:05 Z forelax Cezar (COCI16_cezar) C++14
40 / 100
3 ms 380 KB
#include<bits/stdc++.h>
using namespace std;
int n;
vector<pair<int,string> > v;
vector<vector<int> > dir(26,vector<int> (26));
bool good=true;
void attack(int b,int e,int c){
    int l=e-b;
    if(l<2)return;
    vector<char> tht(l);
    vector<bool> seen(26);
    for(int i = b ; i < e ; i ++)
        tht[i-b]=c<v[i].second.length()?v[i].second[c]:' ';
    bool f=false;
    for(int i = 0 ; i < l ; i ++){
        if(tht[i]!=' ')f=true;
        else{
            if(f){
                good=false;
                return;
            }
        }
    }
    for(int i = l-1,j ; i >= 0 ; ){
        j=i;
        while(j>=0&&tht[j]==tht[i])
            j--;
        if(tht[i]!=' '){
            int ch=tht[i]-'a';
            if(seen[ch]){
                good=false;
                return;
            }
            for(int k = 0 ; k < 26 ; k ++){
                if(seen[k]){
                    if(dir[k][ch]){
                        good=false;
                        return;
                    }
                    dir[ch][k]=true;
                }
            }
            attack(b+j+1,b+i+1,c+1);
            seen[tht[i]-'a']=true;
        }
        i=j;
    }
}
vector<int> visited(26);
vector<int> visiting(26);
vector<int> rez;
void dfs(int ind){
    if(visiting[ind]){
        good=false;
        return;
    }
    visiting[ind]=true;
    for(int i = 0 ; i < 26 ; i ++){
        if(dir[ind][i]&&!visited[i]){
            dfs(i);
        }
    }
    rez.push_back(ind);
    visited[ind]=true;
}
int main(){
    cin>>n;
    v.resize(n);
    vector<string> s(n);
    for(int i = 0 ; i < n ; i ++){
        cin>>s[i];
    }
    for(int j = 0 ; j < n ; j ++){
        cin>>v[j].first;
        v[j].second=s[v[j].first-1];
        v[j].first=j+1;
    }
//    sort(v.begin(),v.end());
    attack(0,n,0);
    if(!good){
        cout<<"NE";
        return 0;
    }
    for(int i = 26 ; i >= 0 ; i --){
        if(!visited[i]){
            dfs(i);
        }
    }
    if(!good){
        cout<<"NE";
        return 0;
    }
    cout<<"DA"<<endl;
    vector<char> ord(26);
    for(int i = 0 ; i < rez.size() ; i ++){
        ord[rez[i]]=char('a'+25-i);
    }
    for(int i = 0 ; i < 26 ; i ++)cout<<ord[i];
}


Compilation message

cezar.cpp: In function 'void attack(int, int, int)':
cezar.cpp:13:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         tht[i-b]=c<v[i].second.length()?v[i].second[c]:' ';
                  ~^~~~~~~~~~~~~~~~~~~~~
cezar.cpp: In function 'int main()':
cezar.cpp:95:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 0 ; i < rez.size() ; i ++){
                     ~~^~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 380 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 2 ms 376 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 368 KB Output is correct
2 Correct 2 ms 256 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 376 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 372 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 2 ms 256 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 376 KB Output is correct
2 Correct 3 ms 376 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 252 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 376 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 376 KB Output isn't correct
2 Halted 0 ms 0 KB -