- 分为 1 位, 2位, 3位 。然后从底向高位逐渐添加。 
 - dp[0] = 1是由动态规划方程给出来的。 
 - 三种情况,先走1,再走2,最后走3.
dp[i] = dp[i-1]; dp[i] += dp[i-2];dp[i] += dp[i-3];  - 记得对long long 最大值取余。2147483647 
 
 #include<bits/stdc++.h>
using namespace std;
const long long mod = 2147483647;
int main(){
    string s;
    while(cin>>s){
        vector<int> dp(s.size()+1,0);
        dp[0] = 1;
        dp[1] =1;
        for(int i=2; i<= s.size();i++){
            dp[i] = dp[i-1];
            if(s.substr(i-2,2)=="10"||s.substr(i-2,2)=="11"){
                 dp[i] += dp[i-2];
            }
            if(i>=3 && (s.substr(i-3,3)=="100"||s.substr(i-3,3)=="101"||
              s.substr(i-3,3)=="110"||s.substr(i-3,3)=="111")){
                 dp[i] += dp[i-3];
            }
            dp[i]%= mod;
        }
        cout<<dp[s.size()]<<endl;
    }
    return 0;
}