看没人写dp做法,就分享一个dp做法吧,感觉异或做法小登不一定看得懂

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int mod=998244353;

void solve(){
    string s;
    cin>>s;
    //dp[i][j][k]
    //j=0说明s[i]变成了0
    //j=1说明s[i]变成了1
    //k=0前面个数为奇数个的时候
    //k=1前面个数为偶数个的时候
    int dp[s.length()][2][2];
    memset(dp,0,sizeof(dp));
    //0是偶数,所以要更新,也就是说答案里有0个相同的对数,也算是一种方案
    if(s[0]=='?')
    {
        dp[0][0][1]=1;
        dp[0][1][1]=1;
    }
    else
    {
        int num=s[0]-'0';
        dp[0][num][1]=1;
        dp[0][num][1]=1;
    }
    for(int i=1;i<s.length();i++)
    {
        /*当第i位相邻两个字符相同的对数为奇数的时候,有两种可能
        1.前面的数字和他相同,但是前面有偶数个相邻两个字符相同的对数(加了他就成偶数了)
        2.前面的数字和他不同,但是前面有奇数个相邻两个字符相同的对数
        相邻两个字符相同的对数为偶数同理
        注意?的时候0和1都可以取
        */
        if (s[i]!='?')
        {
            int num=s[i]-'0';
            dp[i][num][0]=(dp[i-1][num][1]+dp[i-1][(num+1)%2][0])%mod;
            dp[i][num][1]=(dp[i-1][num][0]+dp[i-1][(num+1)%2][1])%mod;
        }
        else
        {
            dp[i][0][0]=(dp[i-1][0][1]+dp[i-1][1][0])%mod;
            dp[i][0][1]=(dp[i-1][0][0]+dp[i-1][1][1])%mod;
            dp[i][1][0]=(dp[i-1][1][1]+dp[i-1][0][0])%mod;
            dp[i][1][1]=(dp[i-1][1][0]+dp[i-1][0][1])%mod;
        }
    }
    int ans;
    if (s[s.length()-1]=='?')ans=(dp[s.length()-1][0][1]+dp[s.length()-1][1][1])%mod;
    else ans=dp[s.length()-1][s[s.length()-1]-'0'][1]%mod;
    cout<<ans<<endl;
}

signed main() {
    ios::sync_with_stdio(0),cin.tie(0);
    int t;
    cin>>t;
    while(t--)solve();
    return 0;
}
/*
⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣤⣤⣤⣤⣤⣤⣤⡀⠀⠀⠀⣾⡟⣻⣿⠇⠀⠀⠀⣠⣶⣶⣶⣶⣶⣤⣤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⣠⡶⢾⣿⣿⣿⣿⣿⣿⣿⣿⣧⣤⣴⣶⡿⣿⡿⠷⢶⣶⣤⣤⣿⣿⣿⣿⣿⣿⣿⣿⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⢰⡿⠁⠀⠀⠀⠉⢉⣩⣽⡿⠟⠋⠉⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠛⠛⠿⣿⣿⣿⣿⣿⣿⣄⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⣠⣶⠿⣿⠇⠀⠀⠀⣠⣴⠿⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠛⢷⣦⡉⠙⠛⠿⣶⣄⠀⠀⠀⠀⠀⠀
⠀⠀⢠⣿⠁⢸⡟⠀⠀⢠⣾⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⢻⣦⡀⠀⠀⢻⡇⠀⠀⠀⠀⠀
⠀⠀⢸⡏⠀⢸⡇⠀⣰⡿⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡀⠀⠀⣠⡀⠀⠀⠀⠘⢿⣆⠀⢸⣇⠀⠀⠀⠀⠀
⠀⠀⣿⡇⠀⢸⣷⣼⡿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣴⡄⠀⠀⠀⠀⠀⠀⣿⢿⣆⠀⣿⣧⡄⠀⠀⠀⠈⢻⣧⣿⣿⡇⠀⠀⠀⠀
⠀⠀⣿⡇⠀⠀⣿⡿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⡾⠋⢻⣆⠀⠀⠀⠀⢰⡏⠀⠙⢷⣌⡉⠀⠀⡀⠀⠀⠀⢻⣿⢸⡇⠀⠀⠀⠀
⠀⢀⣿⢀⣤⣶⠟⠁⠀⠀⠀⠀⠀⠀⢰⡆⠀⠀⣠⣾⠏⠁⠀⠀⠙⢷⣦⣀⣴⠟⠀⠀⠀⠀⠙⠻⣦⣌⣿⠀⠀⠀⢨⣿⢸⡧⠀⠀⠀⠀
⠀⢸⣿⠈⠻⢷⡆⠀⠀⠀⠀⠀⠀⢀⣿⣣⣴⡾⠋⠀⣀⣤⡀⠀⠀⠀⠈⠙⠁⠀⠀⣤⣤⣀⠀⠀⠀⠙⣿⠂⠀⠀⢸⣯⢸⣿⠀⠀⠀⠀
⠀⣸⡇⠀⠀⢺⡇⠀⠀⠀⠀⠀⠀⢸⡏⠉⠁⣠⣴⣾⣿⠟⠃⠀⠀⣾⣿⠟⠀⠀⠀⠈⠻⣿⣷⣦⡀⠀⣿⢀⣀⠀⣸⡟⢸⣿⠀⠀⠀⠀
⠀⣿⡇⠀⠀⠸⣧⠀⣷⡀⠀⠀⠀⢸⣧⠀⠾⠿⠛⠉⠀⠀⠀⠀⢠⣿⣿⠃⠀⠀⠀⠀⠀⠀⠙⠿⠇⠘⣿⡟⠋⣠⡿⠁⢸⣿⠀⠀⠀⠀
⠀⣿⠁⠀⠀⠀⠻⣧⡸⣷⡀⠀⢀⣀⢻⣆⠀⠀⠀⠀⠀⠀⠀⠀⠘⠿⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣿⣡⣶⠟⠁⠀⢸⣿⠀⠀⠀⠀
⢸⡿⠀⠀⠀⠀⠀⠙⢿⣾⣷⣆⠈⠛⣿⡟⠀⣇⠀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣴⡟⠋⠿⠛⠁⠀⠀⠀⠸⣿⠀⠀⠀⠀
⢸⡇⠀⠀⠀⠀⠀⠀⠀⠈⠉⠛⢿⣶⣾⡧⠀⠙⠚⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⣿⠀⠀⠀⠀
⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⡏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢹⣧⠀⠀⠀⠀⠀⠀⠀⠀⣿⡇⠀⠀⠀
⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⡿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡀⠀⠈⣿⡄⠀⠀⠀⠀⠀⠀⠀⢹⣧⠀⠀⠀
⡿⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣿⠇⠀⠀⠀⠀⠀⣦⠀⠀⠀⠀⢠⣶⠀⠀⣶⡄⠀⠀⠀⣸⡿⠀⠀⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⣿⡄⠀⠀
⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⣼⡟⠀⠀⠀⠀⠀⠀⢿⣧⡀⠀⢀⣼⡟⠀⠀⠘⠿⣶⣤⣶⠟⠁⠀⠀⢸⣷⠀⠀⠀⠀⠀⠀⠀⠀⠹⣷⠀⠀
⠁⠀⠀⠀⠀⠀⠀⠀⠀⢠⣿⠃⠀⠀⠀⠀⠀⠀⠀⠙⠻⠿⠟⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⡀⠀⠀⠀⠀⠀⠀⠀⠀⢿⣆⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⣼⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⡀
*/