fork download
  1. #include <iostream>
  2. #include <fstream>
  3. #include <vector>
  4. #include <queue>
  5. #include <stack>
  6. #include <algorithm>
  7. #include <cstdio>
  8.  
  9. using namespace std;
  10.  
  11. int dp[3010][3010][2];
  12.  
  13. int main() {
  14. string str;
  15. cin>>str;
  16. if(str[0] !='1') {
  17. dp[0][1][0] = 1;
  18. }
  19. if(str[0] != '0') {
  20. dp[0][1][1] = 1;
  21. }
  22. for(int i = 1; i < str.size(); i++) {
  23. for(int j = 1; j <=str.size(); j++) {
  24. if(str[i] != '1') {
  25. dp[i][j][0] = dp[i-1][j-1][1] + dp[i-1][j][0];
  26. if(dp[i][j][0] >= 1000000007) {
  27. dp[i][j][0] -= 1000000007;
  28. }
  29. }
  30. if(str[i] != '0') {
  31. dp[i][j][1] = dp[i-1][j-1][0] + dp[i-1][j][1];
  32. if(dp[i][j][1] >= 1000000007) {
  33. dp[i][j][1] -= 1000000007;
  34. }
  35. }
  36. //cerr<<dp[i][j][0]<<" "<<dp[i][j][1]<<endl;
  37. }
  38. }
  39. if (str[str.size()-1] =='?') {
  40. for(int i = 1; i <= str.size(); i++) {
  41. cout<<(dp[str.size()-1][i][0] + dp[str.size()-1][i][1]) % 1000000007<<endl;
  42. }
  43. } else {
  44. for(int i = 1; i <= str.size(); i++) {
  45. cout<<dp[str.size()-1][i][str[str.size()-1]-'0']<<endl;
  46. }
  47. }
  48.  
  49. }
  50.  
Success #stdin #stdout 0s 74240KB
stdin
Standard input is empty
stdout
Standard output is empty