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的更多相关文章
随机推荐
- webpack 单独打包指定JS文件
背景 最近接到一个需求,因为不确定打出的前端包所访问的后端IP,需要对项目中IP配置文件单独拿出来,方便运维部署的时候对IP做修改.因此,需要用webpack单独打包指定文件. CommonsChun ...
- FFmpeg滤镜使用
滤镜(filter)详细介绍参考官方文档. 常用的滤镜功能,像图像加水印/字幕.去logo.图形旋转缩放等,但滤镜不仅仅包括视频部分,还包括音频处理的,像变声变调.声场控制(重低音/留声机/摇滚等效果 ...
- Learn day7 继承(单、多、菱形)\多态\魔术方法\装饰器\异常
1.继承 1.1 单继承# ### 继承 """ (1) 单继承 (2) 多继承 至少2个类,子类和父类 一个类继承另外一个类,当前类是子类 (衍生类) 被继承的这个类是 ...
- php之策略模式
策略模式:封装算法,选择所用具体实现的置业由客户对象承担. 将算法具体类,然后互相替换,不影响客户. <?php /** * 设计模式之策略模式 * User: 小狗蛋儿 * Date: 201 ...
- python爬虫04 Requests
接下来我们要来玩一个新的库 这个库的名称叫做 Requests 这个库比我们上次说的 urllib 可是要牛逼一丢丢的 毕竟 Requests 是在 urllib 的基础上搞出来的 通过它我们可以用更 ...
- Qt基础之菜单栏
本篇介绍Qt菜单栏相关操作,分为三部分:1.菜单栏相关的类介绍:2.系统菜单的生成和响应:3.弹出菜单的生成和响应:菜单栏通常只有以QMainWindow为基类的程序中才用到,以QWidget为基类的 ...
- 内网渗透 day2-nmap和nc的使用
nmap和nc的使用 nmap的使用 1. nmap -sSV 172.16.100.214 -T4 -F -sS进行SYN扫描,是比较隐匿的 -sV探测打开端口的服务的信息 -sSV将上面两种一起使 ...
- mysql上月最后一天,当月最后一天
select last_day(DATE_SUB(now(),INTERVAL 1 MONTH)) #上月最后一天日期 %Y-%m-%d select last_day(curdate()) #当月最 ...
- 设置Eclipse 字体 - MD终于摸到了
以前总是没办法设置Eclipse的 左边 资源管理器 字体.思想老局限在Eclipse的Font Setting里,跳不出这个玄妙的莫比乌斯环似的圈圈儿......每次戴着眼镜设置完字体,然后坐在电脑 ...
- 在 Kubernetes Ingress 中支持 Websocket/Socket 服务
Kubernetes Ingress 可将集群内部的 Service 通过 HTTP/HTTPS 的方式暴露供外部访问,并通过路径匹配规则定义服务的路由.但是 Ingress 对 TCP/UDP 的服 ...