![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#include <iostream> #include <cstring> #include <cstdio> #define ll long long using namespace std; char s[50]; ll dp[50][50]; int f(int x){return x>=0 ? x:(-x);} int to(char s){ if(s>='0'&&s<='9') return s-'0'; else return s-'A'+10; } int main(){ while(~scanf("%s",s+1)){ int l=strlen(s+1); memset(dp,0,sizeof dp); if(s[1]=='?'){ for(int i=1;i<=l;i++) dp[1][i]=1; }else{ dp[1][to(s[1])]=1; } for(int i=2;i<=l;i++){ if(s[i-1]=='?'&&s[i]=='?'){ for(int j=1;j<=l;j++){ for(int k=1;k<=l;k++){ if(f(j-k)>=2) dp[i][k]+=dp[i-1][j]; } } }else if(s[i-1]!='?'&&s[i]=='?'){ for(int k=1;k<=l;k++){ if(f(to(s[i-1])-k)>=2) dp[i][k]+=dp[i-1][to(s[i-1])]; } }else if(s[i-1]=='?'&&s[i]!='?'){ for(int j=1;j<=l;j++){ if(f(to(s[i])-j)>=2) dp[i][to(s[i])]+=dp[i-1][j]; } }else{ if(f(to(s[i])-to(s[i-1]))>=2) dp[i][to(s[i])]+=dp[i-1][to(s[i-1])]; } } ll ans=0; for(int i=1;i<=l;i++){ ans+=dp[l][i]; } cout<<ans<<endl; } return 0; }