转载自 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的更多相关文章

随机推荐

  1. ABAP CA CO CS CP 等操作符

    DATA: L_STR1 TYPE STRING, L_STR2 TYPE STRING. L_STR1 = 'ca'. "匹配字符 L_STR2 = 'hubab'. "被匹配字 ...

  2. Luogu P2447 [SDOI2010]外星千足虫

    题意 给定 \(n\) 个变量和 \(m\) 个异或方程,求最少需要多少个才能确定每个变量的解. \(\texttt{Data Range:}1\leq n\leq 10^3,1\leq m\leq ...

  3. ModelSerializer 高级使用

    前言 ModelSerializer中还具有一些高级用法,如批量更新.批量删除.批量创建等. 但是批量过来的数据格式都需要与前端做好协商,什么样的数据格式是单条操作,什么样的数据格式是批量操作. 如下 ...

  4. Netty源码解析 -- 事件循环机制实现原理

    本文主要分享Netty中事件循环机制的实现. 源码分析基于Netty 4.1 EventLoop 前面分享服务端和客户端启动过程的文章中说过,Netty通过事件循环机制(EventLoop)处理IO事 ...

  5. 1. Spark Word Count

    1. request: 2. scala: sc.textFile("input").flatMap(_.split(" ")).map((_,1)).redu ...

  6. 分四个阶段学习python并找到一份好工作

    第一阶段 关注公众号"轻松学编程"了解更多. 详细学习资料 需要时间一个月. 1.python概念 ​ python是一种解释型.面向对象.动态数据类型的高级程序语言. ​ 理解: ...

  7. 不停机不更新代码线上调试BUG的工具

    如果你有以下痛点,请你查看本文章: 1.我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? 2.遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? 3.线上遇到某个用户的 ...

  8. 不断要求用户输入学生姓名,输入q结束.

    while (true) { Console.WriteLine("请输入学生姓名"); string a = Console.ReadLine(); if (a == " ...

  9. AES的数学基础

    有限域 有限域上的运算 加法 两个多项式进行加法运算,就是两个多项式对应系数模2相加 乘法 两个多项式进行乘法运算:两个多项式相乘 若运算结果超过7次方,则必须对此结果进行一个多项式m(x)模运算,其 ...

  10. CentOS6.x 安装 nginx-1.19.4

    1.下载nginx http://nginx.org/en/download.html wget  http://nginx.org/download/nginx-1.19.4.tar.gz 2.解压 ...