平常水题 - Atcoder 058 - C - 怪文書 / Dubious Document(字符串的处理)

                                                             C - 怪文書 / Dubious Document
                                                      Time limit : 2sec / Memory limit : 256MB

Score : 300 points

Problem Statement
Snuke loves "paper cutting": he cuts out characters from a newspaper headline and rearranges them to form another string.

He will receive a headline which contains one of the strings S1,…,Sn tomorrow. He is excited and already thinking of what string he will create. Since he does not know the string on the headline yet, he is interested in strings that can be created regardless of which string the headline contains.

Find the longest string that can be created regardless of which string among S1,…,Sn the headline contains. If there are multiple such strings, find the lexicographically smallest one among them.

Constraints
1≤n≤50
1≤|Si|≤50 for every i=1,…,n.
Si consists of lowercase English letters (a - z) for every i=1,…,n.
Input
Input is given from Standard Input in the following format:

n
S1

Sn
Output
Print the lexicographically smallest string among the longest strings that satisfy the condition. If the answer is an empty string, print an empty line.

Sample Input 1
3
cbaa
daacc

acacac


Sample Output 1

aac


The strings that can be created from each of cbaa, daacc and acacac, are aa, aac, aca, caa and so forth. Among them, aac, aca and caa are the longest, and the lexicographically smallest of these three is aac.

Sample Input 2
3
a
aa

b


Sample Output 2


The answer is an empty string.


(打比赛的时候没看懂题意,很尴尬......)

题意 :用n个字符串S1.......Sn 。每个字符串都由小写的a........z中的字母组成。找出每个字符串共有的字符并挑选最少的。如:样例: S1  :cbaa

                            S2  :daacc

                            S3  :acacac

三个字符串共有的字符是 a 和 c ,其中

S1  :有2个a       S2  :有2个a     S3  :有3个a     挑选最少的  --  aa


S1  : 有1个c       S2  :有2个c     S3 : 有3个c     挑选最少的  --  c


最后把挑选出来的字符按字典序最小排列 -- aac




解题思路:就直接扫一遍,每次就取最少的就行了(主要是考对字符串的处理)


#include<bits/stdc++.h>
using namespace std;

char h[1000][1000];//第一个方括号记录第i个字符串,第二个方括号记录第i个字符串的第j个字符。
int s[1000],ans1[1000],ans2[1000];

int main(){
	int n,flag = 0;
	scanf("%d",&n);
	for(int i = 1;i <= n;i++){
		scanf("%s",h[i]);//这里字符串的输入要注意一下
		s[i] = strlen(h[i]);
	}
	for(int i = 49;i <=74;i++){
		ans2[i] = 10000000;//初始化
	}
	for(int i = 1;i <= n;i++){
		for(int j = 0;j < s[i];j++){
	    	ans1[h[i][j] - '0']++;
		}
		for(int k = 49;k <= 74;k++){
			ans2[k] = min(ans1[k],ans2[k]);
		}
		memset(ans1,0,sizeof(ans1));
	}
	char p;
	for(int i = 49;i <= 74;i++){
		if(ans2[i] != 0){
			for(int j = 1;j <= ans2[i];j++){
				flag = 1;
				printf("%c",i + '0');
			}
		}
	}
	if(flag == 0) printf("\n");
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值