[0630]Tyvj 1063 数字串

 

描述
给你一个长度为n的数字串,数字串里会包含1-m这些数字。如果连续的一段数字子串包含了1-m这些数字,则称这个数字字串为NUM串。你的任务是求出长度最短的NUM串是什么,只需要输出这个长度即可。
输入
输入数据有多组
第一行给定n和m。 (1<=n,m<=100000)
第二行n个数,表示数字串,数字间用空格隔开。
输出
如果存在NUM串则输出最短NUM串长度,否则输出"NO"。
样例输入
5 3
1 2 2 3 1
样例输出
3

C++水过

 

ExpandedBlockStart.gif C++ code 
 1 # include<iostream>
 2  using  namespace std;
 3  int main()
 4 {
 5      int n,m,i,ap,j,l;
 6      int a[ 200001],b[ 200001];
 7     cin>>n>>m;
 8      for ( int i= 1;i<=n;i++) cin>>a[i];
 9     ap= 1;
10     i= 1;
11     b[a[i]]= 1;
12     l= 2147483647;
13      for(j= 2;j<=n;j++)
14     {
15                       if(b[a[j]]== 0)ap++;
16                      b[a[j]]++;
17                       while(b[a[i]]> 1)
18                      {
19                                      b[a[i]]--;
20                                      i++;
21                      }
22                       if ((ap==m)&&(l>j-i+ 1))l=j-i+ 1;  
23 
24    } 
25     if (l== 2147483647) cout<< " NO "<<endl;
26     else cout<<l<<endl;
27     return  0;
28 }

 

转载于:https://www.cnblogs.com/shy-/archive/2012/06/30/2570930.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值