cf886d Restoration of string

明确几点

  1. 假设有串 ab,那么 a 后头必须是 b,b 前头必须是 a,否则就不是最频繁的了。
  2. 不可成环,aba是非法的。
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <string>
    using namespace std;
    int n, len, ru[35], chu[35];
    bool edge[35][35], dan[35], vis[35];
    char ss[35];
    string ans;
    bool dfs(int x){
    vis[x] = true;
    ans = ans + char(x+‘a‘);
    for(int i=0; i<26; i++){
        if(edge[x][i]){
            if(vis[i])  return false;
            return dfs(i);
        }
    }
    return true;
    }
    int main(){
    cin>>n;
    for(int i=1; i<=n; i++){
        scanf("%s", ss);
        len = strlen(ss);
        if(len==1)  dan[ss[0]-‘a‘] = true;
        else
            for(int i=0; i<len-1; i++)
                edge[ss[i]-‘a‘][ss[i+1]-‘a‘] = true;
    }
    for(int i=0; i<26; i++)
        for(int j=0; j<26; j++)
            if(edge[i][j])
                ru[j]++, chu[i]++;
    for(int i=0; i<26; i++)
        if(ru[i]>1 || chu[i]>1){//忠臣不侍二主,好字符不能同时做另外两个字符的前、后
            printf("NO\n");
            return 0;
        }
    ans = "";
    for(int i=0; i<26; i++){
        if(ru[i]==0 && chu[i])
            if(!dfs(i)){
                printf("NO\n");
                return 0;
            }
        if(dan[i] && ru[i]==0 && chu[i]==0)//单个字符特判
            ans = ans + (char)(i+‘a‘);
    }
    for(int i=0; i<26; i++)
        if(ru[i] || chu[i])
            if(!vis[i]){
                printf("NO\n");
                return 0;
            }
    cout<<ans<<endl;
    return 0;
    }

原文地址:https://www.cnblogs.com/poorpool/p/8325334.html

时间: 2024-10-28 07:31:14

cf886d Restoration of string的相关文章

【CF886D】Restoration of string 乱搞

[CF886D]Restoration of string 题意:对于给定的一个母串,定义一个字符串是出现频率最多的,当且仅当它在母串中出现的次数最多(可以有多个出现次数最多的,出现的位置可以重叠). 现在给你一个字符串集合S,问你如果要求S中的所有字符串的出现频率都是最多的,最短的母串是什么.(如果有多个长度相同的母串,输出字典序最小的). |S|<=100000 题解:容易发现出现次数最多的一定是单个字符. 那么对于S中任意两个相邻的字符ab,一旦出现a后面就只能出现b.所以我们可以从a到b

Codeforces Round #445 div.2 D. Restoration of string 乱搞

D. Restoration of string 题意:给你n个字符串,让你构造一个终串,使得这n个字符串都是终串的最小频繁子串,如果不存在输出NO.  最频繁子串:出现次数最多的子串 tags: 直接暴力怼?? #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a;

【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个

C# 引用类型之特例string

在C#编程的时候经常会使用字符串(string)类型,它也是引用类型,但是处处都不作为引用的用法来使用,实属特例,下来我一一罗列出来,供自己记忆方便: 1)字符串的直接赋值:本身字符串就是引用类型,应该使用  new 对象方法一个实例,但是微软为了方便大家,可以直接定义字符串变量 并且赋值操作,例如: string a = "我的中国心"; ,这样只是简化我们的操作: 2)一个字符串赋值给另一个字符串变量:正常的引用类型会将两个引用变量指向同一个地址,但是一个字符串变量赋值给另一个字符

C++ String 及其与char[]的比较

在学习C++之前  一般都是学过了C语言了 在C语言中   我们对字符串进行保存操作  使用的是char[] 但是在C++中    string比char[]的使用更为频繁  常见    下面稍微讲一下我对于string的认知 1.与其他的标准库类型一样   用户程序需要使用String类型对象  就必须包含相关的头文件   (为了编写方便   需要提供合适的using声明) #include <string> using std::string; 2.string对象的定义与初始化 stri

java String 类 基础笔记

字符串是一个特殊的对象. 字符串一旦初始化就不可以被改变. String s = "abc";//存放于字符串常量池,产生1个对象 String s1=new String("abc");//堆内存中new创建了一个String对象,产生2个对象 String类中的equals比较字符串中的内容. 常用方法: 一:获取 1.获取字符串中字符的个数(长度):length();方法. 2.根据位置获取字符:charAt(int index); 3.根据字符获取在字符串中

The constructor ClassPathXmlApplicationContext(String) refers to the missing type BeansException

"The constructor ClassPathXmlApplicationContext(String) refers to the missing type BeansException" "构造函数ClassPathXmlApplicationContext(字符串)是指缺失类型BeansException" 出现错误的原因:jar没有正确引入,即使表面上你能import包. import org.junit.Test; import org.spring

float类型如何转换为string类型

在一些很大的float类型的地方会用科学记数法表示,这个时候如果想完整记录下来,还是得转字符串,这里书写一个float类型转string类型的方法 <?php function float_to_string($float=0) { if(stripos($float, "e")!==false) { $tmp = explode("e",strtolower($float)); $float=bcmul($tmp[0], bcpow(10, $tmp[1])

JAVA: String详解

String 类用来存储字符串 ,是不可变的. 1. 基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(==),比较的是他们的值. 2. 复合数据类型(类) 当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false.用 str.equals(str2) 方法来比较字符串的值是否相等. 3. len