POJ 3320 Jessica's Reading Problem(尺取法)

题意:给你一个连续的串,找出一个连续且包含所有出现的数字的子串,求这个子串最短为多少。

分析:尺取法,先得出出现的不同数字的个数np,然后从头开始先选出等于np的子序列,然后减去该子序列左边的值,减去后如果还是等于np,继续减去左边的值,如果小于np了,则向右加,直到再次达到np.

类似题POJ 3061 - Subsequence,http://blog.csdn.net/itaskyou/article/details/51387443





#include <iostream>
#include<cstdio>
#include<map>
using namespace std;
#define N 1000005
int a[N];
map<int ,int >ma;
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        ma.clear();
        for(int i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
            ma[a[i]]=1;
        }
        int np=ma.size();
        ma.clear();
        int num=0,s=0,t=0,ans=n;
        while(1)
        {
            while(t<n&&num<np)
            {
                if(ma[a[t]]==0)
                {
                    num++;
                }
                 ma[a[t]]++;
                  t++;
            }
                if(num<np)
                    break;
                ans=min(ans,t-s);
                ma[a[s]]--;
                if(ma[a[s]]==0)
                {
                    num--;
                }
                s++;
        }
        printf("%d\n",ans);
    }
    return 0;
}


你可能感兴趣的:(re,poj,poj,reading,pro,Jessicas,3320,Jessicas,3320)