【CodeForces】889 B. Restoration of string

【题目】B. Restoration of string

【题意】当一个字符串在字符串S中的出现次数不小于任意子串的出现次数时,定义这个字符串是高频字符串。给定n个字符串,求构造出最短的字符串S满足着n个字符串都是高频字符串,若不存在输出NO,若存在多个输出字典序最小的一个。n<=10^5,Σ|si|<=10^5。

【算法】模拟(图论?字符串?)

【题解】首先出现频率都是1次,多次没有意义,所以每个字母至多出现一次。

那么对于出现在n个字符串中的子串ab,要求在S中ab也必须相邻。

所以对n个字符串中出现的相邻字符连有向边,如果图是若干条独立的单链,那么按字典序输出这些链就是答案,否则无解。

无解包括:不是单链(有分叉)和有环。

#include<cstdio>
#include<cstring>
const int maxn=100010;
char s[maxn];
bool vis[maxn];
int n,nex[maxn],pre[maxn],sum=0;
int main(){
    scanf("%d",&n);
    memset(nex,-1,sizeof(nex));memset(pre,-1,sizeof(pre));
    for(int i=1;i<=n;i++){
        scanf("%s",s);int len=strlen(s);
        for(int j=1;j<len;j++){
            int c=s[j-1]-‘a‘,d=s[j]-‘a‘;
            if((~nex[c]&&nex[c]!=d)||(~pre[d]&&pre[d]!=c))return puts("NO"),0;
            nex[c]=d;pre[d]=c;vis[d]=1;
        }
        vis[s[0]-‘a‘]=1;
    }
    for(int i=0;i<26;sum+=vis[i++])if(vis[i]&&pre[i]==-1)for(int j=i;~j;j=nex[j])sum--;
    if(sum)return puts("NO"),0;
    for(int i=0;i<26;sum+=vis[i++])if(vis[i]&&pre[i]==-1)for(int j=i;~j;j=nex[j])printf("%c",j+‘a‘);
    return 0;
}        

原文地址:https://www.cnblogs.com/onioncyc/p/8576383.html

时间: 2024-07-30 11:51:56

【CodeForces】889 B. Restoration of string的相关文章

【leetcode】Reverse Words in a String

问题:给定一个字符串,字符串中包含若干单词,每个单词间由空格分隔,将单词逆置,即第一个单词成为最后一个单词,一次类推. 说明:字符串本身可能包含前导空格或后导空格,单词间可能包含多个空格,要求结果中去掉前导和后导空格,单词间空格只保留一个. 与rotate函数类似,先逆置每个单词,再将所有字符串逆置. void reverseWords(string &s) { if(s.size() == 0) return; char blank = ' '; size_t len = s.size();

【leetcode】Reverse Words in a String (python)

陆陆续续几个月下来,终于把题刷完了,过程中遇到的python的题解很少,这里重新用python实现下,所以题解可能都是总结性的,或者是新的心得,不会仅针对题目本身说的太详细. def reverseWords(self, s): s = ' '.join(s.split()[::-1]) return s [ : :  -1 ] 是将元素进行翻转 [leetcode]Reverse Words in a String (python),布布扣,bubuko.com

【题解】AGC007E Shik and Copying String(贪心)

[题解]AGC007E Shik and Copying String(贪心) 刚开始看完题以为是一个老鼠进洞模型,不过发现这里还要求不同种类的匹配不可香蕉,而且代价不是一定的... 追踪最终得到的串\(T\)每个字符\(T_i\)的来源,可以发现是一条引向\(p<i\)的折线,可以发现这条直线覆盖的\(x\)轴上的长度越小越好,最终答案是所有形如这样的匹配的折线中拐点最多的折线的拐点个数.用一个双端队列维护当前匹配的拐点的\(x\)坐标,从后向前考虑\(T\)中每个字符的匹配. 设当前枚举到\

【codeforces】【比赛题解】#915 Educational CF Round 36

虽然最近打了很多场CF,也涨了很多分,但是好久没写CF的题解了. 前几次刚刚紫名的CF,太伤感情了,一下子就掉下来了,不懂你们Div.1. 珂学的那场我只做了第一题--悲伤. 这次的Educational Round打的还可以,虽然吧没有涨分(因为我是紫色的啊). 做了前4题,后面3题也比较简单,陆续也做完了. 所以心情好,来写一篇题解! [A]花园 题意: 长度为\(k\)的线段,用若干个长度为\(a_i\)的线段,正好覆盖.(\(a_i|k\)) 给定\(n\)个\(a_i\),求出最小的\

【CodeForces】947 D. Picking Strings

[题目]D. Picking Strings [题意]给定只含'A','B','C'的字符串,支持以下变换:1.A - BC   2.B - AC   3.C - AB   4.AAA - empty string(左边变成右边) 给定S串和T串,q次询问,每次给出S串的一个子串x和T串的一个子串y,求x是否能变到y.n,m,q<=10^5. [算法]模拟??? [题解]观察一些规律,首先B和C等价:B-AC-AAB-AAAC-C. 然后B前面的A可以消除:AB-AAC-AAAB-B. 所以新的

【codeforces】【比赛题解】#854 CF Round #433 (Div.2)

cf一如既往挺丧 看丧题点我! [A]分数 Petya是数学迷,特别是有关于分数的数学.最近他学了所谓一个分数被叫做"真分数"当且仅当其分子小于分母,而一个分数被叫做"最简分数"当且仅当其分子分母互质.在闲暇时间,Petya在用计算器研究:如何把最简真分数转换为小数等问题.有一天他不小心把除号(÷)按成了加号(+),导致他得到了分子与分母的和.Petya想要得到他原来的分数,但他很快发现这不是唯一的.所以现在他想要知道最大的最简真分数使得其分子与分母的和为n. 输入

【CodeForces】835D Palindromic characteristics

[算法]区间DP [题解]涉及回文问题的区间DP都可以用类似的写法,就是h[i][j]表示i~j是否回文,然后就可以O(1)判断回文了. f[i][j]=k表示该字符串是k-th字符串,因为首先要求回文,既然回文那么左半边和右半边就肯定一样了. #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int maxn=5010; int f[maxn][maxn]

【codeforces】【比赛题解】#849 CF Round #431 (Div.2)

cf的比赛越来越有难度了--至少我做起来是这样. 先看看题目吧:点我. 这次比赛是北京时间21:35开始的,算是比较良心. [A]奇数与结束 "奇数从哪里开始,又在哪里结束?梦想从何处起航,它们又是否会破灭呢?" 给定一个长度为n的序列.确定能不能将序列分成奇数个长度为奇数的非空字串,而且这其中每个子串以奇数开头,以奇数结尾.可以只分成一个(1也是奇数). 输入 第一行一个正整数n,表示序列长度. 第二行n个整数,表示序列中的元素. 输出 输出"Yes"或"

【CodeForces】841C. Leha and Function(Codeforces Round #429 (Div. 2))

[题意]定义函数F(n,k)为1~n的集合中选择k个数字,其中最小数字的期望. 给定两个数字集A,B,A中任意数字>=B中任意数字,要求重组A使得对于i=1~n,sigma(F(Ai,Bi))最大. [算法]数学结论+数学期望+排序 [题解]很无奈,这题放在div2 C,难以推导的期望公式,广为人知的结论,容易观察样例得出的做法,都体现了这道题的不合理性. F(n,k)=(n+1)/(k+1) 公式推导可能触及我的知识盲区了QAQ 得到公式后,显然要求k尽可能小,n尽可能大,经验告诉我们随着两数