• 【CF886D】Restoration of string 乱搞


    【CF886D】Restoration of string

    题意:对于给定的一个母串,定义一个字符串是出现频率最多的,当且仅当它在母串中出现的次数最多(可以有多个出现次数最多的,出现的位置可以重叠)。

    现在给你一个字符串集合S,问你如果要求S中的所有字符串的出现频率都是最多的,最短的母串是什么。(如果有多个长度相同的母串,输出字典序最小的)。

    |S|<=100000

    题解:容易发现出现次数最多的一定是单个字符。

    那么对于S中任意两个相邻的字符ab,一旦出现a后面就只能出现b。所以我们可以从a到b连一条边。这样最后我们得到的图一定形如若干条链。简单判一下无解的情况,最后输出即可。

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    using namespace std;
    int n,m,flag;
    char s[100010];
    int to[30],vis[30],from[30],used[30];
    int main()
    {
    	memset(to,-1,sizeof(to)),memset(from,-1,sizeof(from));
    	scanf("%d",&n);
    	int i,j,a,b,l;
    	for(i=1;i<=n;i++)
    	{
    		scanf("%s",s),l=strlen(s),s[l]='a'-1;
    		for(j=1;j<l;j++)
    		{
    			a=s[j-1]-'a',b=s[j]-'a';
    			if((to[a]!=-1&&to[a]!=b)||(from[b]!=-1&&from[b]!=a))
    			{
    				puts("NO");
    				return 0;
    			}
    			to[a]=b,from[b]=a,vis[b]=1;
    		}
    		vis[s[0]-'a']=1;
    	}
    	for(i=0;i<26;i++)	if(vis[i]&&from[i]==-1)	for(j=i;j!=-1;j=to[j])	s[m++]=j+'a',used[j]=1;
    	for(i=0;i<26;i++)	if(vis[i]&&!used[i])
    	{
    		puts("NO");
    		return 0;
    	}	
    	s[m]='',printf("%s",s);
    	return 0;
    }//4 mail ai lru cf
  • 相关阅读:
    linux下使用kermi续
    关于vhdl中integer消耗资源的一些讨论
    linux时间编程
    Linux下C编程文件编程
    C语言I博客作业04
    C语言I博客作业02
    C语言I博客作业02
    第一周作业
    php 面向对象
    php 面向对象封装和继承
  • 原文地址:https://www.cnblogs.com/CQzhangyu/p/8052899.html
Copyright © 2020-2023  润新知