#include <iostream>#include <string>#include <queue>#include <vector>usingnamespacestd;inlineintmin(inta,intb){if(a<b)returna;returnb;}stringstr[1111];voidtask(){intn;intgraph[300]={0};// is alphabet is in graphintincoming[300]={0};// prerequisitesintedge[100][100]={0};cin>>n;inti,j,k;for(i=1;i<=n;i++){cin>>str[i];}for(j=2;j<=n;j++){i=j-1;intl=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;}}}intcnt=0;// how many are in graphqueue<int>head;for(i=0;i<26;i++){if(graph[i]){cnt++;if(!incoming[i]){head.push(i);}}}vector<int>ans;intvis[100]={0};intcnt2=0;while(!head.empty()){inttt=head.front();head.pop();queue<int>qu;qu.push(tt);vis[tt]=1;while(!qu.empty()){cnt2++;intt=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);}elseif(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;}}intmain(){cin.sync_with_stdio(false);cout.sync_with_stdio(false);intc;cin>>c;while(c--){task();}}
사이클 체크도 하고 아무리 반례찾아봐도 안나오는데 왜 오답일까요..
9년 전
0개의 댓글이 있습니다.
정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면
온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야
합니다. 현재 문제를 푸셨습니다.
conankun
사이클 체크도 하고 아무리 반례찾아봐도 안나오는데 왜 오답일까요..
9년 전