[CodeForces] 510 C Fox And Names [拓扑排序]
2016-03-18 23:48
459 查看
题意:给定n个字符串,问能不能求出一个字母表使得字符串满足字母表上面的字典序
思路:拓扑排序,但是这个题目的坑有点多 比较坑的就是aa a这种情况是错误的 因为aa的字典序明显比a要大
思路:拓扑排序,但是这个题目的坑有点多 比较坑的就是aa a这种情况是错误的 因为aa的字典序明显比a要大
<pre name="code" class="cpp">#include <stdio.h> #include <string.h> #include <iostream> using namespace std; int Map[27][27]; int indegree[100]; char voc[105][105]; char ans[105]; void topo() { int cnt=0; int top=0; for(int i=0;i<26;i++) { for(int j=0;j<26;j++) { if(indegree[j]==0) { indegree[j]--; ans[cnt++]=j+'a'; for(int k=0;k<26;k++) { if(Map[j][k]) { Map[j][k]=0; indegree[k]--; } } break; } } } printf("%s\n",ans); } int main() { int n; scanf("%d",&n); memset(indegree,0,sizeof(indegree)); memset(Map,0,sizeof(Map)); for(int i=1;i<=n;i++) { scanf("%s",voc[i]); } int flag; int vis=1; for(int i=1;i<=n;i++) { for(int j=i;j<=n;j++) { flag=0; int leni=strlen(voc[i]); int lenj=strlen(voc[j]); for(int k=0;k<min(leni,lenj);k++) { if(voc[i][k]!=voc[j][k]) { flag=1; if(Map[voc[i][k]-'a'][voc[j][k]-'a']==0) { Map[voc[i][k]-'a'][voc[j][k]-'a']=1; indegree[voc[j][k]-'a']++; } break; } } if(!flag&&leni>lenj) { vis=0; } } } for(int k=0;k<26;k++) { for(int i=0;i<26;i++) { for(int j=0;j<26;j++) { if(Map[i][k]&&Map[k][j]&&!Map[i][j]) { Map[i][j]=1; indegree[j]++; } } } } for(int i=0;i<26;i++) { for(int j=0;j<26;j++) { if(Map[i][j]&&Map[j][i]||vis==0) { printf("Impossible\n"); return 0; } } } topo(); return 0; }
相关文章推荐
- 如何获取 Android 设备的CPU核数、时钟频率以及内存大小
- java面试100题以及答案(二)
- OpenCv3.0架构内容及改变
- Delphi多线程数据库查询(ADO)
- 【LeetCode题意分析&解答】40. Combination Sum II
- javaWeb项目如何添加jar包
- Android常用权限permission列表摘录
- 高精度求平方根
- 枚举类型互相转换(使用GetEnumName和TypeInfo两个函数)
- iOS GCD学习笔记
- 机房收费系统遇到的问题(二) 逆向思维,消费时间不是相减,而是递增
- 蓝桥杯-横向打印二叉树(模拟)
- 关于对象列表遍历问题。
- Oculus Rift, HTC Vive, SONY PSVR的全面对比
- 使用CSS3美化复选框checkbox
- Dialog实现BottomSheet设计
- 237. Delete Node in a Linked List
- animate dong
- 发布你的Python模块
- PO J2602 大数相加