NC50421. 单词游戏
描述
输入描述
多组数据。第一行给出数据组数T,每组数据第一行给出盘子数量N,接下去N行给出小写字母字符串,一种字符串可能出现多次。
输出描述
若存在一组合法解输出Ordering is possible.,否则输出The door cannot be opened.。
示例1
输入:
3 2 acm ibm 3 acm malform mouse 2 ok ok
输出:
The door cannot be opened. Ordering is possible. The door cannot be opened.
C++11(clang++ 3.9) 解法, 执行用时: 74ms, 内存消耗: 476K, 提交时间: 2019-07-26 23:17:39
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<queue> using namespace std; char s[1001]; int t,n,m,a,b,c; int fa[50],u[50],v[50]; int find(int x){ return fa[x]==x?x:fa[x]=find(fa[x]); } int main(){ scanf("%d",&t); while(t--){ memset(u,0,sizeof u); memset(v,0,sizeof v); scanf("%d",&n); a=b=c=0; for(int i=1;i<=30;i++){ fa[i]=i; } for(int i=1;i<=n;i++){ scanf("%s",s+1); m=strlen(s+1); int l=s[1]-'a'+1,r=s[m]-'a'+1; fa[find(l)]=find(r); u[l]++; v[r]++; } for(int i=1;i<=26;i++){ if(((u[i]||v[i])&&(find(i)==i))||u[i]-v[i]>1||u[i]-v[i]<-1){ a++; } } if(a>1){ puts("The door cannot be opened."); continue; } for(int i=1;i<=26;i++){ if(u[i]>v[i]){ b++; } else if(u[i]<v[i]){ c++; } } if(b!=c||b>1){ puts("The door cannot be opened."); continue; } puts("Ordering is possible."); } return 0; }