Codeforces 510C Fox And Names 拓扑排序
2016-01-12 18:38
411 查看
题意
给你n个字符串,问你存不存在一种字母表的顺序,使得这n个字符串是按拓扑序排好的如果存在,给出这种顺序
思路
这题其实很简单,就是扫一遍相邻两个字符串,建立以字母为节点的有向图然后跑一个拓扑序
贴出来的原因,主要是犯了一个特别傻的错误。。当年WA的原因,今天又WA在这了。。。也算是给自己提个醒吧。。
错误就是,g[i][j]赋值为1时,没判定原来g[i][j]是否已经为1,就让入度(i) + 1了。。。。。
实现
#include <bits/stdc++.h> using namespace std; int n; const int maxn = 105; string str[maxn]; int g[30][30]; int ru[30]; vector<char> ans; int main(){ ios::sync_with_stdio(false); cin>>n; for (int i=0;i<n;i++) cin>>str[i]; int flag = 0; for (int i=1;i<n;i++){ bool f1 = 0; for (int j=0;j<min(str[i-1].length(),str[i].length());j++){ if (str[i][j] != str[i-1][j]){ f1 = 1; int a = str[i][j] - 'a', b = str[i-1][j] - 'a'; if (g[b][a] == 0){ g[b][a] = 1; ru[a]++; } break; } } if (f1 == 0 && str[i-1].length() > str[i].length()){ flag = 1; break; } } if (flag){ cout << "Impossible\n"; return 0; } queue<int> q; for (int i=0;i<26;i++){ if (ru[i] == 0) { q.push(i); } } while (q.size()){ int tmp = q.front(); q.pop(); ans.push_back((char)('a' + tmp)); for (int i=0;i<26;i++){ if (g[tmp][i] == 1){ ru[i] --; g[tmp][i] = 0; if (!ru[i]){ q.push(i); } } } } if (ans.size() != 26){ cout << "Impossible\n"; return 0; } for (int i=0;i<ans.size();i++){ cout << ans[i]; } cout << endl; return 0; }
相关文章推荐
- 4412的GPX3引脚的使用
- iOS Xcode 打包之后,不能输出日志
- 学习mongo系列(六)limit(munber),skip(number)
- JVM学习之GC常用算法
- 常用音视频vlc播放的sdp文件格式
- 无名线段树1
- 窗口分割
- Thrift的TBinaryProtocol二进制协议分析
- Linux系统基本操作
- ubuntu14下python3.4安装PIL的步骤
- Educational Codeforces Round 5(C)(DFS+hash)
- debug使用
- android 6.0 and sdk23, when used xx.so has text relocations.
- 160122_孙子兵法_始计
- cocos2dx之lua项目开发中MVC框架的简单应用
- 【转】理解 PHP 依赖注入 | Laravel IoC容器
- 查看一个文件是否支持64位 方法 ,[symbol(s) not found for architecture x86_64]相关
- 数字八
- POJ 3734 Blocks(矩阵优化+DP)
- ElasticSearch 概述