#include<bits/stdc++.h>
using namespace std;
const int mod=1000000007;
char NO[6][8];
char S[1000005];
int f[1000005],bj1[1000005],bj2[1000005],bj,ls;
int main(){
NO[1][1]='0';
NO[1][2]='0';
NO[1][3]='1';
NO[1][4]='1';
NO[2][1]='0';
NO[2][2]='1';
NO[2][3]='0';
NO[2][4]='1';
NO[3][1]='1';
NO[3][2]='1';
NO[3][3]='1';
NO[3][4]='0';
NO[4][1]='1';
NO[4][2]='1';
NO[4][3]='1';
NO[4][4]='1';
NO[5][1]='1';
NO[5][2]='1';
NO[5][3]='0';
NO[5][4]='0';
NO[5][5]='0';
NO[5][6]='1';
NO[5][7]='0';
scanf("%s",S+1);
ls=strlen(S+1);
for(int i=1;i<=ls;i++)
{
if(i>=4)
for(int j=1;j<=4;j++)
{
bj=1;
for(int k=i-4+1;k<=i;k++)
{
if(NO[j][k-i+4]!=S[k])
{
bj=0;
break;
}
}
if(bj)
{
bj1[i]=1;
break;
}
}
if(i>=7)
{
bj=1;
for(int k=i-7+1;k<=i;k++)
{
if(NO[5][k-i+7]!=S[k])
{
bj=0;
break;
}
}
if(bj)
bj2[i]=1;
}
}
f[0]=1;
for(int i=1;i<=ls;i++)
{
if(i>=1)
f[i]=(f[i]+f[i-1])%mod;
if(i>=2)
f[i]=(f[i]+f[i-2])%mod;
if(i>=3&&bj2[i]==0)
f[i]=(f[i]+f[i-3])%mod;
if(i>=3&&bj2[i]==1)
f[i]=((f[i]+f[i-3]-f[i-7])%mod+mod)%mod;
if(i>=4&&bj1[i]==0)
f[i]=(f[i]+f[i-4])%mod;
}
cout<<f[ls]<<endl;
return 0;
}
来源:zr