 /**//*
題意:給出一個串,求最小的一個正數(shù),該數(shù)不能是該串的子串 len<=10^5
一個串的子串有C(len,2)個,感覺很多。但是長度越大,其串的個數(shù)會越小
長度為1時,串的個數(shù)高達(dá)10^5,只要不是特殊數(shù)據(jù),絕對能把[0,9]這個區(qū)間鋪滿
同理
長度為2時,串的個數(shù)也高達(dá)10^5,也能把區(qū)間[0,99]鋪滿
 
長度為5時,串的個數(shù)10^5,有可能鋪滿區(qū)間[0,99999]
但長度為6時,串的個數(shù)10^5,絕對不可能鋪滿區(qū)間[0,999999]

所以枚舉起點,枚舉長度(1到6)將得到的整數(shù)標(biāo)記visit過
最后從1開始(不是0),遇到第一個沒被標(biāo)記過的就是最小的正數(shù)了!

這題一開始估計的時候,子串好大!
但是細(xì)心推一下,發(fā)現(xiàn)長度越大,其個數(shù)越小,分布也越稀疏!
而我們就是要求那些稀疏的沒被訪問過的位置了
*/
#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
搜索
最新評論

|
|