1. 程式人生 > >Newcoder 16 D.Fancy Signal Translate(水~)

Newcoder 16 D.Fancy Signal Translate(水~)

Description

F S T FST 是一名可憐的小朋友,他很強,但是經常 f s t

fst ,所以 r a t i n g rating
一直低迷。

但是重點在於,他真的很強!他發明了一種奇特的加密方式,這種加密方式只有 O I e r OIer 才能破解。

這種加密方式是這樣的:對於一個 01

01 串,他會構造另一個 01 01 串,使得原串是在新串中沒有出現過的最短的串。

現在 F S T FST 已經加密好了一個串,但是他的加密方式有些 B U G BUG ,導致沒出現過的最短的串不止一個,他感覺非常懊惱,所以他希望計算出沒出現過的最短的串的長度。

Input

一行,一個 01 01 串。長度 1 0 5 \le 10^5

Output

一行,一個正整數,表示沒有出現過的最短串的長度。

Sample Input

100010110011101

Sample Output

4

Solution

長度為 i i 的不同串有 2 i 2^i 個,而該串至多隻有 s i + 1 |s|-i+1 個長度為 i i 的子串,故沒出現過的長度最短的串的長度不會超過 18 18 ,那麼我們找出該串所有長度不超過 18 18 的串,將每個串轉化為二進位制表示為該串的數字打上標記,那麼沒打上標記的最短串長度即為答案

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;
}