Problem:
Score : 1600 points

Problem Statement

Taichi thinks a binary string X of odd length N is beautiful if it is possible to apply the following operation \frac{N-1}{2} times so that the only character of the resulting string is 1 :

Choose three consecutive bits of X and replace them by their median. For example, we can turn 00110 into 010 by applying the operation to the middle three bits.

Taichi has a string S consisting of characters 0, 1 and ?. Taichi wants to know the number of ways to replace the question marks with 1 or 0 so that the resulting string is beautiful, modulo 10^{9} + 7.

Constraints

1 \leq |S| \leq 300000

|S| is odd.

All characters of S are either 0, 1 or ?.

Input

Input is given from Standard Input in the following format:

S

Output

Print the number of ways to replace the question marks so that the resulting string is beautiful, modulo 10^{9} + 7.

Sample Input 1

1??00

Sample Output 1

2

There are 4 ways to replace the question marks with 0 or 1 :

11100 : This string is beautiful because we can first perform the operation on the last 3 bits to get 110 and then on the only 3 bits to get 1.

11000 : This string is beautiful because we can first perform the operation on the last 3 bits to get 110 and then on the only 3 bits to get 1.

10100 : This string is not beautiful because there is no sequence of operations such that the final string is 1.

10000 : This string is not beautiful because there is no sequence of operations such that the final string is 1.

Thus, there are 2 ways to form a beautiful string.

Sample Input 2

?

Sample Output 2

1

In this case, 1 is the only beautiful string.

Sample Input 3

?0101???10???00?1???????????????0????????????1????0

Sample Output 3

402589311

Remember to output your answer modulo 10^{9} + 7.

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <bits/stdc++.h>
#define mk make_pair
#define fs first
#define sc second
using namespace std;
typedef long long ll;
typedef long double ld;
char s[300010];
ll mod=1e9+7;
ll mem[300010][2][2][2][2][2], n;
ll dp(int x, int l, int b, bool pre, bool l2, bool z){
  if(x==n)
    return (b&&l2)||(l&&pre)||(z)||(l2&&pre);
  if(mem[x][l][b][pre][l2][z]!=-1)
    return mem[x][l][b][pre][l2][z];
  if(s[x]!='?'){
    if(x==0)
      mem[x][l][b][pre][l2][z]=dp(x+1, 0, 0, s[x]-'0', s[x]-'0', 0);
    else
      mem[x][l][b][pre][l2][z]=dp(x+1, l||((s[x]=='1')&&pre&&(x%2)), b||(s[x]=='1'&&pre&&(x%2==0)), s[x]-'0', l2, z||(s[x]=='1'&&pre&&(x%2==0)&&l));
    mem[x][l][b][pre][l2][z]%=mod;
    return mem[x][l][b][pre][l2][z];
  }
  ll ans=0;
  if(x==0)
    ans=dp(x+1, 0, 0, 1, 1, 0)+dp(x+1, 0, 0, 0, 0, 0);
  else
    ans=dp(x+1, l||(pre&&(x%2)), b||(pre&&(x%2==0)), 1, l2, z||((pre&&(x%2==0))&&l))+dp(x+1, l, b, 0, l2, z);
  ans%=mod;
  mem[x][l][b][pre][l2][z]=ans;
  return ans;
}

int main(){
  scanf("%s",s);
  n=strlen(s);
  memset(mem, -1, sizeof mem);
  ll ans=dp(0,0,0,0,0,0);
  cout<<ans<<endl;
  return 0;
}