Codeforces Round #189 Div2A Magic Numbers

問題

10^9までの数字が与えられるので、それがマジックナンバーかどうかを判定してください。
マジックナンバーは、"1","14","144"の連結で与えられる数字で、
14144, 141414, 1411とかはそうで、1444, 514, 414とかはそうではないです。



解法
・先頭の数が1であること
・4が3個以上連続していないこと
・1,4以外の数字が出てこないこと
が条件となります。
文字列中の144を全部消して、次に14を消して、(ex: "14144" -> "14" -> "")・・・というやりかたで空文字が得られるか、という判定をしているコードもいくつかありましたが、111444のような例で誤答を出してしまいます。

プログラム

#include<iostream>
#include <fstream>
#include <stdio.h>
#include <stdlib.h>
#define _USE_MATH_DEFINES
#include <math.h>
#include<string>
#include<vector>
#include<cmath>
#include<stack>
#include<queue>
#include<sstream>
#include<algorithm>
#include<map>
#include<complex>
using namespace std;


#define li			long long int
#define rep(i,to)	for(int i=0;i<((int)(to));i++)
#define repp(i,start,to)	for(int i=(int)(start);i<((int)(to));i++)
#define pb			push_back
#define sz(v)		((li)(v).size())


int main(){
	string x;
	cin>>x;
	li n=sz(x);
	li res=0;
	li two=1;
	
	rep(i,n){
		if(x[n-i-1]=='0')res=(res*2)%MOD;
		else{
			res=(res*2+two*two)%MOD;
		}
		two=(two*2)%MOD;
	}
	
	cout<<res%MOD<<endl;
	
	return 0;
}