 /**//*
題意:給出一個串,求最小的一個正數,該數不能是該串的子串 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
搜索
最新評論

|
|