小李的遗迹之旅
题目ID:8526选做题100分
最新提交:
Wrong Answer
0 分
历史最高:
Wrong Answer
0 分
时间限制: 1000ms
空间限制: 524288kB
题目描述
题目描述:
小李是一名探险家,这天,他到了一个古代遗迹当中,但是这个遗迹的大门无法打开,但是这个古代遗迹非常的神奇,在大门上不断的闪过一些古代文字,小李的探险经验非常丰富,找到了一块石碑,石碑上记载了破解大门打开的方法
破解规则如下:
石碑上给出了一些古代文字,那些古代文字其实包含了n个古代词语。大门闪烁的古代文字其实是一篇文章,文章由m个段落构成,每个段落都是1个古代词语。你需要做的是记录这篇文章,在文章中找出连续的一些段落,其中包含最多石碑上的古代词语(重复的只算一个)。并且在石碑上出现的古代词语数量尽量多的情况下,还要使选出的文章段落尽量短,最终得到两个数字输出石碑,即可打开大门。
输入格式:
第 1 行一个数 n,接下来 n 行每行是一个长度不超过 10 的字符串,表示一个石碑上出现的古代词语。
接着是一个数 m,然后是 m 行长度不超过 10 的字符串,每个表示文章中的一个段落。
输出格式:
输出文件共 2 行。第 1 行为文章中最多包含的石碑上的古代词语,第 2 行表示在文章中包含最多石碑上古代词语的最短的连续段的长度。
样例1输入:
3 wink cat art 5 wink cat cat art wink
样例1输出:
3 3
样例2输入:
5 aa bb cc dd aa 6 aa z cc cc bb cc
样例2输出:
3 5
数据规模:
对于 100% 的数据,n≤1000,m≤10^5。
样例2解释:
aa,bb,cc都在文章中出现过,所以第一问答案是3
最短的区间是[1,5],也就是aa,z,cc,cc,bb,包含aa,bb,cc,所以长度是5-1+1=5
#include<bits/stdc++.h>
using namespace std;
int n,m,l=1,sum=INT_MAX,cnt=0,cp=0;
string s[100005];
map<string,int> mp,kp;
int main(){
cin>>n;
for(int i = 1; i<=n; i++){
string h;
cin>>h;
mp[h]++;
}
cin>>m;
for(int i = 1; i<=m; i++){
cin>>s[i];
if(mp.count(s[i]) == 1 && kp[s[i]] == 0){
cnt++;
}
kp[s[i]]++;
while(l<=i && kp[s[l]] == 2 && i != l){
kp[s[l]]--;
l++;
}
if(cnt>cp){
sum = i-l+1;
cp = cnt;
}else{
sum = min(i-l+1,sum);
}
}
cout<<cnt<<endl<<sum<<endl;
}