dictionary 문제 질문입니다. 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(); } } 사이클 체크도 하고 아무리 반례찾아봐도 안나오는데 왜 오답일까요.. 10년 전
0개의 댓글이 있습니다. 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.
conankun
사이클 체크도 하고 아무리 반례찾아봐도 안나오는데 왜 오답일까요..
10년 전