dictionary 문제 질문입니다.

  • conankun
    conankun
    #include <iostream>
    #include <string>
    #include <queue>
    #include <vector>
    using namespace std;
    inline int min(int a, int b) {
        if(a<b) return a;
        return b;
    }
    string str[1111];
    void task() {
        int n;
        int graph[300]={0}; // is alphabet is in graph
        int incoming[300]={0}; // prerequisites
        int edge[100][100]={0};
        cin>>n;
        int i,j,k;
        for(i=1;i<=n;i++) {
            cin>>str[i];
        }
    
        for(j=2;j<=n;j++) {
                i=j-1;
                int l = min(str[i].size(), str[j].size());
                for(k=0;k<l;k++) {
                    if(str[i][k] != str[j][k]) {
                        if(!edge[str[i][k]-'a'][str[j][k]-'a']) {
                            incoming[str[j][k] - 'a']++;
                            edge[str[i][k] - 'a'][str[j][k] - 'a'] = 1;
                            graph[str[i][k] - 'a'] = 1;
                            graph[str[j][k] - 'a'] = 1;
                        }
                        break;
                    }
                }
        }
    
        int cnt=0; // how many are in graph
        queue<int> head;
        for(i=0;i<26;i++) {
            if(graph[i]) {
                cnt++;
                if(!incoming[i]) {
                    head.push(i);
                }
            }
        }
    
        vector<int> ans;
        int vis[100]={0};
        int cnt2=0;
        while(!head.empty()) {
            int tt = head.front();
            head.pop();
            queue<int> qu;
            qu.push(tt);
            vis[tt]=1;
            while(!qu.empty()) {
                cnt2++;
                int t = qu.front();
                ans.push_back(t);
                qu.pop();
                for(i=0;i<26;i++) {
                    if(edge[t][i]) {
                        incoming[i]--;
                        if(incoming[i]==0 && !vis[i]) {
                            vis[i]=1;
                            qu.push(i);
                        } else if(incoming[i] == 0 && vis[i]) {
                            cout<<"INVALID HYPOTHESIS"<<endl;
                            return;
                        }
                    }
                }
            }
        }
    
        if(cnt == cnt2) {
            for(i=0;i<ans.size();i++) {
                printf("%c",(ans[i]+'a'));
            }
            for(i=0;i<26;i++) {
                if(!graph[i]) printf("%c",i+'a');
            }
            cout<<endl;
        } else {
            cout<<"INVALID HYPOTHESIS"<<endl;
        }
    }
    int main() {
        cin.sync_with_stdio(false);
        cout.sync_with_stdio(false);
        int c;
        cin>>c;
        while(c--) {
            task();
        }
    }
    

    사이클 체크도 하고 아무리 반례찾아봐도 안나오는데 왜 오답일까요..


    8년 전
0개의 댓글이 있습니다.
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.