【链接】 我是链接,点我呀:)

【题意】

给你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 <bits/stdc++.h>
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 <int> 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"<<endl,0;
}else {
if (rd[key]>1 || cd[key] >1) return cout <<"NO"<<endl,0;
} special = 0;
while (1){
int x = -1;
if (special!=0) x = special;
for (int key = 'a';x==-1 && key <= 'z';key++)
if (inq[key]){
x = key;
break;
}
if (x==-1) break;
tot--;
inq[x] = 0;
if (special==x) special = 0;
ans += (char) x;
for (int i = 'a';i <= 'z';i++){
if (a[x][i]){
rd[i]--;
a[x][i] = 0;
if (rd[i]==0){
special = i;
inq[i] = 1;
rd[i] = -1;
}else{
return cout <<"NO"<<endl,0;
}
}
}
} if (tot!=0){
cout <<"NO"<<endl;
}else{
cout << ans << endl;
}
return 0;
}

【Codeforces Round #445 (Div. 2) D】Restoration of string的更多相关文章

  1. 【Codeforces Round #445 (Div. 2) C】 Petya and Catacombs

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 看看时间戳为i的点有哪些. 每次优先用已经访问过的点. 如果不行就新创一个点. 注意新创点的时间戳也是i. [代码] #includ ...

  2. 【Codeforces Round #445 (Div. 2) B】Vlad and Cafes

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 傻逼模拟 [代码] #include <bits/stdc++.h> using namespace std; cons ...

  3. 【Codeforces Round #445 (Div. 2) A】ACM ICPC

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 三重循环 [代码] #include <bits/stdc++.h> using namespace std; int ...

  4. 【Codeforces Round #442 (Div. 2) B】Nikita and string

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 枚举中间那一段从哪里开始.哪里结束就好 注意为空的话,就全是a. 用前缀和优化一下. [代码] #include <bits/ ...

  5. 【Codeforces Round #432 (Div. 1) B】Arpa and a list of numbers

    [链接]h在这里写链接 [题意] 定义bad list是一个非空的.最大公约数为1的序列.给定一个序列,有两种操作:花费x将一个元素删除.花费y将一个元素加1,问你将这个序列变为good list所需 ...

  6. 【Codeforces Round #420 (Div. 2) C】Okabe and Boxes

    [题目链接]:http://codeforces.com/contest/821/problem/C [题意] 给你2*n个操作; 包括把1..n中的某一个数压入栈顶,以及把栈顶元素弹出; 保证压入和 ...

  7. 【Codeforces Round #420 (Div. 2) B】Okabe and Banana Trees

    [题目链接]:http://codeforces.com/contest/821/problem/B [题意] 当(x,y)这个坐标中,x和y都为整数的时候; 这个坐标上会有x+y根香蕉; 然后给你一 ...

  8. 【Codeforces Round #420 (Div. 2) A】Okabe and Future Gadget Laboratory

    [题目链接]:http://codeforces.com/contest/821/problem/A [题意] 给你一个n*n的数组; 然后问你,是不是每个位置(x,y); 都能找到一个同一行的元素q ...

  9. 【Codeforces Round #423 (Div. 2) C】String Reconstruction

    [Link]:http://codeforces.com/contest/828/problem/C [Description] 让你猜一个字符串原来是什么; 你知道这个字符串的n个子串; 且知道第i ...

随机推荐

  1. Template template parameter(模板參数) example

    /********************************************************************************* Copyright (C), 19 ...

  2. tcp_tw_recycle检查tcp_timestamps的内核代码

    注意:本文档中的内核代码的版本号:linux-4.0.5 /************************************************* * Author : Samson * ...

  3. Apache Thrift使用总结

    使用感受 之前对Thrift的理解有点不准确,使用之后发现Thrift比想象中的要简单得多. Thrift做的事情就是跨语言的分布式RPC,通过编写.thrift文件声明接口类和方法,client调用 ...

  4. 迷茫了好一阵决定做WEB前端

    前两个学期事实上总是每一个学期给自己做一个计划.可是计划都付诸流水,不是自己不坚持,仅仅由于目标太不明白,总是不见成效.前一段时间最终感觉计划还得做,可是不能超过一个月,要把计划做到仔细到每一周每一天 ...

  5. POJ 2039 Floyd

    句意理解题 解释输入好啦: 第一行n个数 m场电影 随后m行 每行的第一个数 代表 有k奶牛在这个电影中出现过 随后k个数 是奶牛的编号 如果两头奶牛在同一个电影中出现过 相互度为1 奶牛们的相互度可 ...

  6. 企业实战之部署Solarwinds Network八部众

    企业实战之部署Solarwinds Network 网管系统八部众 Orion Network Performance Monitor是全面的带宽性能监控和故障管理软件,能监控并收集来自路由器.交换机 ...

  7. Autoencoders and Sparsity(二)

    In this problem set, you will implement the sparse autoencoder algorithm, and show how it discovers ...

  8. LuoguP3356 火星探险问题(费用流)

    题目描述 火星探险队的登陆舱将在火星表面着陆,登陆舱内有多部障碍物探测车.登陆舱着陆后,探测车将离开登陆舱向先期到达的传送器方向移动.探测车在移动中还必须采集岩石标本.每一块岩石标本由最先遇到它的探测 ...

  9. 南阳oj 士兵杀敌(二) 题目116 NYOJ 数据结构

     /*士兵杀敌(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描写叙述 南将军手下有N个士兵.分别编号1到N.这些士兵的杀敌数都是已知的. 小工是南将军手下的军师, ...

  10. WIN8.1 上安装 debian8.7 遇到的问题及解决方法

    WIN8.1 上安装 debian8.7 遇到的问题及解决方法 参照百度经验 <win7下硬盘安装debian7> ( http://jingyan.baidu.com/article/8 ...