SRX_Test_2_key
转载自 Livedream
YBT1396
#include<iostream>
#include<map>
#include<queue>
#include<vector>
using namespace std;
/*
无解的情况:
1. 能确定的字母种类少于目标单词的字母种类,比如能确定abc,但目标单词中含有e
2. 拓扑排序的结果不唯一,也就是每次发现的入度为0的结点不唯一
3. 拓扑排序有环
*/
string s[5005], t, std_s;
map<char, char> Map;
vector<char> v[125];
int in[125], tot;
bool vis[125];
char ans[27]; string get_dict() //获取图中的字符的字典序 字符串
{
string tmp = ""; //标准字典序串
for(char c = 'a'; c <= 'z'; c++)
{
if(vis[c] == true)
{
tmp += c;
}
}
return tmp; //标准字符串
} bool is_enough() //判断结点是否足够
{
for(int i = 0; i < t.size(); i++)
{
if(vis[t[i]] == false) //目标单词t中存在字符t[i],而建的图中没有
return false;
}
return true;
} bool topo_sort()
{
queue<char> q;
int cnt = 0;
for(char c = 'a'; c <= 'z'; c++)
{
if(vis[c] == true && in[c] == 0)
{
q.push(c);
cnt++;
if(cnt > 1)
return false;
}
}
while(q.empty() == false)
{
char cur = q.front();
q.pop();
ans[++tot] = cur; //存拓扑排序结果
int cnt = 0; //记录拆掉cur结点后有多少结点的入度减为0
for(int i = 0; i < v[cur].size(); i++)
{
char next = v[cur][i];
in[next]--;
if(in[next] == 0)
{
cnt++; //统计入度为0的点
q.push(next);
}
}
if(cnt > 1) //入度为0的点多于1个,无解
return false;
}
std_s = get_dict(); //获取图中的节点数
if(tot < std_s.size()) //有环
return false;
return true;
}
void print()
{
for(int i = 1; i <= tot; i++)
{
Map[ans[i]] = std_s[i-1]; //ans和std_s建立对应关系
}
for(int i = 0; i < t.size(); i++)
{
cout << Map[t[i]];
}
return ;
}
int main()
{
int k;
cin >> k;
for(int i = 1; i <= k; i++)
{
cin >> s[i];
if(i == 1)
continue;
for(int j = 0; j < min(s[i].size(), s[i-1].size()); j++)
{
char c1 = s[i-1][j], c2 = s[i][j];
if(c1 != c2)
{
v[c1].push_back(c2);
in[c2]++; //入度
vis[c1] = vis[c2] = true;
break; //只找第一对不相同的字符
}
}
}
cin >> t; //目标字符串
if(is_enough() == false || topo_sort() == false)
{
cout << 0;
return 0;
}
print();
return 0;
}
SRX_Test_2_key的更多相关文章
随机推荐
- 在CentOS 8 上 部署 .Net Core 应用程序
在Centos 8 上 部署 .Net Core 应用程序 -- 记录篇 1.更新dnf 源 1 dnf update 2.安装 Asp.Net Core 运行时 1 dnf install ...
- makefile管理项目
makefile: 管理项目. 命名:makefile Makefile --- make 命令 1 个规则: 目标:依赖条件 (一个tab缩进)命令 1. 目标的时间必须晚于依赖条件的时间,否则,更 ...
- 全球最火的程序员学习路线!没有之一!3天就在Github收获了接近1w点赞
大家好,我是G哥,目前人在荆州办事,但是干货还是要安排上! 国外有一个爆火的开发人员学习路线,目前已经在 Github收获了 131 k+ star,Star 数量在 Github 所有仓库中排名第 ...
- PLC模拟量采集模块分辨率是什么意思?
14位分辨率的模块(mo kuai)和16位分辨率的模块有什么不同的地方? 14位的模块最高位是符号位,我们用S表示符号位,那么这个模块的数值范围(fàn wéi)就是S111 1111 1111 1 ...
- mysql数据库——选择优化的数据类型
选择更小的数据类型:一般情况下,应该尽量使用可以正确存储数据的最小数据类型.更小的数据类型通常更快,它们占用更少的磁盘.内存和CPU缓存,并且处理时需要的CPU周期也更少.但是要确保没有低估需要存储的 ...
- P2937 [USACO09JAN]Laserphones S
题意描述 [USACO09JAN]Laserphones S 学过物理的同学都知道这种镜子是可以把光线旋转 90 度的. 那么显然就是要求添加镜子的最小个数. 貌似题目漏了一句就是题目保证有解的情况. ...
- 【QT】QtConcurrent::run()+QThreadPool实现多线程
往期链接: <QThread源码浅析> <子类化QThread实现多线程> <子类化QObject+moveToThread实现多线程> <继承QRunnab ...
- python插入数据库mysql
#-*- coding:utf-8 -*- import MySQLdb #alter table test add index prefixIdx_test(ext(2));//前缀索引 try: ...
- 【linux】led子系统
目录 前言 linux子系统 led子系统 led子系统实战-系统调用-ARM平台 前言 接下来记录的是 led子系统 目前不涉及驱动源码 linux子系统 在 Linux 系统中 绝大多数硬件设备都 ...
- socket套接字(字节序、地址转换)
什么是socket: socket可以看成是用户进程与内核网络协议栈的编程接口. socket不仅可以用于本机的进程间通信,还可以用于网络上 不同主机之间的进程通信.IPv4套接口地址结构 struc ...