///////////////////////////////////////////////////
// 1677474 2008-10-25 14:46:52 Accepted 2202 C++ 0 192 VRS
//計算編碼後再解碼的種數
//利用分治法,把字串s二分為s1和s2,再把兩部分的種數相乘
//注意情況:合并s1和s2時,考慮相鄰接的兩數可以組成一個編碼,還有對0的多種情況的討論
#include<iostream>
#include<string>
using namespace std;
char s[10000];
bool conbine(char s[],int l,int r) //判斷兩數是否可以編碼,可以返回1,否則返回0
{
if(s[l]>'2' || s[l]=='0') return 0;
if(s[l]=='2' && s[r]>'6') return 0;
return 1;
}
long Acode(char s[],int l,int r) //二分遞迴計算種數
{
long mid,ansl,ansr,ans;
if(l==r) return 1; //1個數時返回1
if(l+1==r) //2個數的情況
if(s[r]=='0') //當第二個數是0時,只有一種編碼
return 1;
else
return conbine(s,l,r)+1;
if(l+2==r) //3個數的情況
if(s[l+1]=='0' || s[r]=='0') // 當第二或第三個數是0時,只有一種編碼
return 1;
else
return conbine(s,l,l+1)+conbine(s,l+1,r)+1;
mid=(r-l+1)/2-1+l; //l與r的中值
if(s[mid+1]=='0') //當s2的首元素是0,如“1101”,不用計算s[mid]和s[mid+1]分開
{ //的兩部分種數
ansl=Acode(s,l,mid-1);
ansr=Acode(s,mid+2,r);
return ansl*ansr;
}
ansl=Acode(s,l,mid);
ansr=Acode(s,mid+1,r);
ans=ansl*ansr;
if(s[mid+2]=='0') return ans; //當出現如“1011011”的情況時,由於s2的首元素"1"要和其後的
//"0"組成一個編碼,所以不須考慮s[mid]和s[mid+1]組成一編碼的情況
if(conbine(s,mid,mid+1))
{
ansl=Acode(s,l,mid-1);
ansr=Acode(s,mid+2,r);
return ans+ansl*ansr;
}
else return ans;
}
int main()
{
int len;
while(cin>>s && s[0]!='0')
{
len=strlen(s);
cout<<Acode(s,0,len-1)<<endl;
}
return 0;
}