博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Codeforces Round #445 (Div. 2) D】Restoration of string
阅读量:5157 次
发布时间:2019-06-13

本文共 1556 字,大约阅读时间需要 5 分钟。

【链接】

【题意】

给你n个字符串。
让你构造一个字符串s。
使得这n个字符串。
每个字符串都是s的子串。
且都是出现次数最多的子串。
要求s的长度最短,且s的字典序最小。

【题解】

如果s是出现最多的子串。
那么s的任意一个子串也都是出现次数最多的子串。
那么考虑"ab"这样一个子串。
则肯定要有字符'a'后面接的一定是'b'
且字符'b'前接的一定是'a'
不然'a'或'b'的出现次数一定会大于"ab"了。
则对于任意一个字符串s,在s[i]和s[i+1]之间建立一条有向边,s[i]->s[i+1];
这就是一个类似拓扑排序的题了。
(如果没办法做拓扑排序,则无解
但是有一定要求。
即每个点的出度和入度一定要是1.
否则,如果有a->b,c->b这种情况。
拓扑排序救过是acb,但是没办法满足a后面紧跟着b.
还有a->c,a->b这种也显然不行,也没办法两者都满足。
然后要优先拓扑有边的点。
比如
"c"
"bd"
则b进入答案之后,下一个应该拓扑的是d而不是"c",因为d是要紧跟在b后面的1

【代码】

#include 
using namespace std;int n;string s;bool bo[300];int a[300][300],rd[300],cd[300],tot = 26;int inq[300],special;queue
dl;string ans = "";int main(){ #ifdef LOCAL_DEFINE freopen("F:\\c++source\\rush_in.txt", "r", stdin); #endif ios::sync_with_stdio(0),cin.tie(0); cin >> n; for (int i = 1;i <= n;i++){ cin >> s; int len = s.size(); for (int j = 0;j < len;j++) bo[(int)s[j]] = true; for (int j = 0;j < len-1;j++){ if (a[(int)s[j]][(int)s[j+1]]==0) { rd[(int)s[j+1]]++; cd[(int) s[j]]++; } a[(int)s[j]][(int)s[j+1]] = 1; } } for (int key = 'a';key <= 'z';key++) if (!bo[key]){ rd[key] = cd[key] = -1; tot--; } for (int key = 'a';key <= 'z';key++) if (rd[key]==0){ inq[key] = 1; rd[key] = -1; if (cd[key] > 1) return cout <<"NO"<
1 || cd[key] >1) return cout <<"NO"<

转载于:https://www.cnblogs.com/AWCXV/p/7830717.html

你可能感兴趣的文章
Micro Image Gallery(for Jquery1.7+)
查看>>
你知道哪些linux命令,能把文件上传到远程linux服务器
查看>>
洛谷 P1063 能量项链
查看>>
TinyMCE的使用-语言配置
查看>>
bootstrap 导航栏
查看>>
myeclipse运行html页面修改不生效
查看>>
【1】web.xml中的spring的配置
查看>>
基于springCloud的分布式架构体系
查看>>
客服浮动效果实现
查看>>
吴裕雄--天生自然 高等数学学习:常数项级数的审敛法
查看>>
单向链表仿LinkedList
查看>>
CSS中对图片(background)的一些设置心得总结
查看>>
leecode第三题(无重复字符的最长子串)
查看>>
【BZOJ 4832 】 4832: [Lydsy2017年4月月赛]抵制克苏恩 (期望DP)
查看>>
【 POJ - 3801】Crazy Circuits(有源汇、上下界最小流)
查看>>
控件被覆盖后还能点击的解决办法
查看>>
jquery 入门
查看>>
spring aop
查看>>
使用hexo搭建个人博客
查看>>
MYSQL 数据库命令
查看>>