[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;
}

猜你喜欢

转载自www.cnblogs.com/sdfzhsz/p/9427463.html