有没有哪位大佬救我一下

小李的遗迹之旅

题目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;
}