[JZOJ]100046【NOIP2017提高A组模拟7.14】收集卡片

Star 计划订购一本将要发行的周刊杂志,但他可不是为了读书,而是—— 集卡。 已知杂志将要发行 N 周(也就是 N 期),每期都会附赠一张卡片。Star 通 过种种途径,了解到 N 期杂志附赠的卡片种类。Star 只想订购连续的若干期, 并在这些期内收集所有可能出现的种类的卡片。现在他想知道,他最少需要订 购多少期。

对于 30%的数据,N ≤ 300;
对于 40%的数据,N ≤ 2000;
对于 60%的数据,N ≤ 5000;
对于 80%的数据,N ≤ 100000;
对于 100%的数据,N ≤ 500000。

见代码,很简单。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n,cnt,num,ans;
int vis[500];
char s[500006];
int main() {
	ans=0x3f3f3f3f;
	scanf("%d%s",&n,s);
	for(int i=0;i<n;i++) if(!vis[s[i]]) cnt++,vis[s[i]]=1;
	memset(vis,0,sizeof vis);
	for(int r=0,l=0;r<n;r++) {
		if(!vis[s[r]]) num++;vis[s[r]]++;
		while(num==cnt) {
			l++;vis[s[l-1]]--;
			if(!vis[s[l-1]]) {num--,ans=min(ans,r-l+2);break;}
		}
	}
	cout<<ans<<endl;
}
posted @ 2018-08-05 21:52  SWHsz  阅读(182)  评论(0编辑  收藏  举报