未出现的子串[unapeared.pas/c/cpp][重点]

 

未出现的子串[unapeared.pas/c/cpp]

 

[说明]此题中的子数字串,数字并不一定连续出现在母数字串中.比如我们定义1 3是串1 5 3的一个子串,但3 5不是1 5 3的一个子串.

串1 5 3的所有子串为:

1

5

3

1 5

5 3

1 3

1 5 3

共7个.

[题目描述]有一个长度为n的数字串,其中会出现数字1,2,3,...,q(5<=q<=9).SubRaY遇到的问题是,需要求出一个长度最小的串(出现的数字也是1..q),使得该串不是这个数字串的子串.为了简化问题,你只需要输出这个串的长度即可.

 

例如对于数字串S=

1 3 5 2 4 1 3 5 2 2 2 2 3 4 1 5 3 2(q=5)

 

长度为1和2的数字子串全出现过,但是你找不出子串S'=4 4 4.因此答案是3

 

[输入][unapeared.in]

 

第一行两个数,串长n和出现的数字的个数q

接下来n行表示该数字串每一位的数字.

 

[输出][unapeared.out]

 

未出现的子串的最小长度

 

[样例输入]

 

18 5

1

3

5

2

4

1

3

5

2

2

2

2

3

4

1

5

3

2

 

[样例输出]

 

3

 

[数据范围]

 

对于30%的数据,1<=n<=20,q=5

对于100%的数据,1<=n<=100000,5<=q<=9

=================================

贪心....

-------------

我想不出这么强的...

看了解题报告后才写出的..

定义一个hash[q]

逐渐读入x....

若读完后hash[q]还未被完全定义就输出ans+1

在读之中hash[q]满了,就hash[q]:=false,inc(ans);t:=0;

=============

var
  n,q:longint;
  f:array[1..9]of boolean;
procedure init;
begin
  assign(input,'unapeared.in');
  assign(output,'unapeared.out');
  reset(input); rewrite(output);
end;

procedure terminate;
begin
  close(input); close(output);
  halt;
end;

procedure main;
var
  i,t,ans,x:longint;
begin
  readln(n,q);
  fillchar(f,sizeof(f),false);
  t:=0;
  ans:=0;
  for i:=1 to n do
    begin
      read(x);
      if not f[x] then
        begin
          f[x]:=true;
          inc(t);
        end;
      if t=q then
        begin
          t:=0;
          inc(ans);
          fillchar(f,sizeof(f),false);
        end;
    end;
  writeln(ans+1);
end;

begin
  init;
  main;
  terminate;
end.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值