Newcoder 16 D.Fancy Signal Translate(水~)
阿新 • • 發佈:2018-11-04
Description
是一名可憐的小朋友,他很強,但是經常
,所以
一直低迷。
但是重點在於,他真的很強!他發明了一種奇特的加密方式,這種加密方式只有 才能破解。
這種加密方式是這樣的:對於一個 串,他會構造另一個 串,使得原串是在新串中沒有出現過的最短的串。
現在 已經加密好了一個串,但是他的加密方式有些 ,導致沒出現過的最短的串不止一個,他感覺非常懊惱,所以他希望計算出沒出現過的最短的串的長度。
Input
一行,一個 串。長度
Output
一行,一個正整數,表示沒有出現過的最短串的長度。
Sample Input
100010110011101
Sample Output
4
Solution
長度為 的不同串有 個,而該串至多隻有 個長度為 的子串,故沒出現過的長度最短的串的長度不會超過 ,那麼我們找出該串所有長度不超過 的串,將每個串轉化為二進位制表示為該串的數字打上標記,那麼沒打上標記的最短串長度即為答案
Code
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1000005;
char s[maxn];
int f[maxn];
int main()
{
scanf("%s",s+1);
int n=strlen(s+1);
for(int i=1;i<=n;i++)
{
int res=s[i]-'0';
for(int j=1;j<=18&&i+j<=n;j++)
{
f[res]=1;
res=2*res+s[i+j]-'0';
}
}
for(int i=0;;i++)
if(!f[i])
{
int num=0;
while(i)i/=2,num++;
printf("%d\n",num);
break;
}
return 0;
}