【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]=‘\0‘,printf("%s",s);
	return 0;
}//4 mail ai lru cf
时间: 2024-10-10 03:47:08

【CF886D】Restoration of string 乱搞的相关文章

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;

cf886d Restoration of string

明确几点 假设有串 ab,那么 a 后头必须是 b,b 前头必须是 a,否则就不是最频繁的了. 不可成环,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

topcoder-srm610-div2-550(暴力乱搞)

给你一个01矩阵,求其中最大的01交替的矩阵 由于n最大才100,所以直接暴力乱搞 先求出第i行,所有列往上的合法长度,然后枚举以第j列为最左边的列,计算可以得到的最大矩阵 /************************************************************************* > File Name: 2.cpp > Author: ALex > Mail: [email protected] > Created Time: 2015年

Codeforces Amr and Chemistry(数学+乱搞)

题意:给n个数,每个数每次可以乘二或除以二(向下取整相当于左移或右移),问最少经过多少次操作可以使这n个数变相等. 思路:首先考虑每个数的可能取值,将一个数表示成s*2^k的形式,s是奇数. 那么这个数的所有可能取值为s'*2^x,(s'=s/2,(s/2)/2,.....)且s'*2^x<=100000 因为这题数据范围不大,而且每个值可能的取值不多最多几百个,所以记录1到100000每个值可能被取到的次数以及总操作数,最后从1遍历到100000取最小的ans即可 ps:个人赛这道题做了一下午

【bzoj2241】[SDOI2011]打地鼠  暴力+乱搞

2241: [SDOI2011]打地鼠 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 1069 Solved: 679 [Submit][Status][Discuss] Description 打地鼠是这样的一个游戏:地面上有一些地鼠洞,地鼠们会不时从洞里探出头来很短时间后又缩回洞中.玩家的目标是在地鼠伸出头时,用锤子砸其头部,砸到的地鼠越多分数也就越高. 游戏中的锤子每次只能打一只地鼠,如果多只地鼠同时探出头,玩家只能通过多次挥舞锤子的方式打

ZOJ 3829 Known Notation 乱搞

乱搞: 1.数字的个数要比*的个数多一个,如果数字不足需要先把数字补满 2.最优的结构应该是数字都在左边,*都在右边 3.从左往右扫一遍,遇到数字+1,遇到*-1,如果当前值<1则把这个*和最后面的一个数字交换位置 Known Notation Time Limit: 2 Seconds      Memory Limit: 65536 KB Do you know reverse Polish notation (RPN)? It is a known notation in the area

POJ 3077-Rounders(水题乱搞)

Rounders Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7697   Accepted: 4984 Description For a given number, if greater than ten, round it to the nearest ten, then (if that result is greater than 100) take the result and round it to th

uva 10780 Again Prime? No Time. 质因子乱搞

求最大的k   使得 m^k 能被n!整除 m^k就是让m的每个质因子个数增加了k倍,只要求得n!的质因子能让m增加多少倍就够了.当然这里要取增加倍数最少的. 木桶装水的量取决于最短的木板. 预处理2-n每个数的质因子情况,由于n有10000,前10000个素数有1000+个,所以维护前缀和不划算. case只有500 所以干脆每次都算一遍. #include<stdio.h> #include<string.h> #include<iostream> #include

一道乱搞题并不能ac.

题目描述 传销组织 传销组织 GPLT的 宗旨是"有志者事竟成",他们最近在执行一项宏伟的 宗旨是"有志者事竟成",他们最近在执行一项宏伟的 宗旨是"有志者事竟成",他们最近在执行一项宏伟的 宗旨是"有志者事竟成",他们最近在执行一项宏伟的 宗旨是"有志者事竟成",他们最近在执行一项宏伟的 宗旨是"有志者事竟成",他们最近在执行一项宏伟的 宗旨是"有志者事竟成",他们