转载自 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. python获取响应某个字段值的三种方法

    近期将要对两个接口进行测试,第一个接口的响应值是第二个接口的查询条件.为了一劳永逸,打算写个自动化测试框架.因为请求和响应都是xml格式的,遇到的问题就是怎么获取xml响应的某一个值.尝试了很多博客的 ...

  2. ABAP CA CO CS CP 等操作符

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

  3. Azure Data Factory(二)复制数据

    一,引言 上一篇主要只讲了Azure Data Factory的一些主要概念,今天开始新的内容,我们开始通过Azure DevOps 或者 git 管理 Azure Data Factory 中的源代 ...

  4. Java中final修饰的方法是否可以被重写

    这是一次阿里面试里被问到的题目,在我的印象中,final修饰的方法是不能被子类重写的.如果在子类中重写final修饰的方法,在编译阶段就会提示Error.但是回答的时候还是有点心虚的,因为final变 ...

  5. Nginx是什么?有什么用?

    一.Nginx是什么 Nginx ("engine x") 是一个高性能的 HTTP 和反向代理服务器,特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服 ...

  6. Liquibase+SpringBoot的简单使用笔记!update+rollback

    该笔记记录了springboot整合liquibase之后,如何根据liquibase ChangeLogFile对数据库进行修改以及回滚操作 参考: baeldung.com JHipster 1. ...

  7. ElasticSearch初步了解和安装(windows上安装)

    ElasticSearch是什么 ElasticSearch(一般简称es)是一个基于Lucene的分布式搜索和数据分析引擎.它提供了REST api 的操作接口.它可以快速的存储.搜索.分析海量数据 ...

  8. .net 之json 一般处理程序

    <%@ WebHandler Language="C#" Class="read" %> using System; using System.We ...

  9. CSS3之径向渐变

        设置最终形状参数: ellipse circle 设置长半轴和短半轴 设置椭圆对称中心 设置色标 输出代码: radial-gradient(circle closest-side at ce ...

  10. Docker 实战(4)- 结合 Jenkins + Gitlab 完成自动化测试的持续集成实战

    如果你还想从头学起 Docker,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1870863.html Jenkins 关联 Gitla ...