 /**//*
题意:给出一个串,求最小的一个正数,该数不能是该串的子串 len<=10^5
一个串的子串有C(len,2)个,感觉很多。但是长度越大,其串的个数会越小
长度为1时,串的个数高达10^5,只要不是特殊数据,绝对能把[0,9]这个区间铺满
同理
长度为2时,串的个数也高达10^5,也能把区间[0,99]铺满
 
长度为5时,串的个数10^5,有可能铺满区间[0,99999]
但长度为6时,串的个数10^5,绝对不可能铺满区间[0,999999]

所以枚举起点,枚举长度(1到6)将得到的整数标记visit过
最后从1开始(不是0),遇到第一个没被标记过的就是最小的正数了!

这题一开始估计的时候,子串好大!
但是细心推一下,发现长度越大,其个数越小,分布也越稀疏!
而我们就是要求那些稀疏的没被访问过的位置了
*/
#include<cstdio>
#include<cstring>

const int MAXN = 1000000;

bool vi[MAXN];
char str[MAXN];

int main()
  {
//freopen("in","r",stdin);
while(~scanf("%s",str))
 {
memset(vi,0,sizeof(vi));
for(int i=0;str[i];i++)
 {
int tmp = 0;
for(int j=1;j<=6&&str[i+j-1];j++)
 {
tmp=10*tmp+str[i+j-1]-'0';
vi[tmp]=1;
}
}
for(int i=1;i<MAXN;i++)
 if(!vi[i]) {printf("%d\n",i);break;}
}
return 0;
}
|
|
常用链接
随笔分类
Links
搜索
最新评论

|
|