未出现的子串[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.