#include<iostream>
#include<vector>
#include<algorithm>
#include<map>
#include<set>
#include<iterator>
#include<numeric>
#include<cmath>
#include<assert.h>
using namespace std;
using ll = long long;

// ll solve(string s, ll zoro){
// 	ll ans = 0;
// 	for(ll i = 0; i < s.length();){
// 		if(s[i] == '?'){
// 			s[i] = '0' + zoro;
// 			i++;
// 			while(s[i] == '?'){
// 				zoro = 1 - zoro;
// 				s[i] = '0' + zoro;
// 				i++;
// 			}
// 		}else{
// 			i++;
// 		}
// 	}
// 	cout << s << endl;
// 	vector<ll> dp(s.length(), 0);
// 	for(ll i = 1; i < s.length(); ++i){
// 		if(s[i] != s[i - 1]){
// 			dp[i] = dp[i - 1] + 1;
// 		}else{
// 			dp[i] = 0;
// 		}
// 	}
// 	ans = accumulate(dp.begin(), dp.end(), 0);
// 	return ans;
// }

ll solve(string s){
	ll n = s.length();
	vector<vector<ll>> dp(n + 1, vector<ll>(2, 0));
	ll ans = 0;

	// for(ll i = 1; i < n; i++){
	// 	if(s[i] != '?' && s[i - 1] != '?'){
	// 		dp[i][0] = dp[i][1] = dp[i - 1][0] + (s[i] != s[i - 1]);
	// 		// assert(dp[i - 1][0] == dp[i - 1][1]);
	// 	}else if(s[i] == '?' && s[i - 1] != '?') {
	// 		dp[i][0] = dp[i - 1][1] + (s[i - 1] != '0');
	// 		dp[i][1] = dp[i - 1][0] + (s[i - 1] != '1');
	// 	}
	// 	else{
	// 		dp[i][0] = dp[i - 1][1] + 1;
	// 		dp[i][1] = dp[i - 1][0] + 1;
	// 	}

	// 	cout << i << " " << dp[i][0] << " " << dp[i][1] << "\n";
	// }

	// ll x = 0, y = 0;
	// for(auto& pr : dp){
	// 	x += pr[0];
	// 	y += pr[1];
	// }

	// return max(x, y);

	
	// for(ll i = 0; i < n; ++i){
	// 	if(s[i] == '?'){
	// 		// cout << (i - 1 >= 0 ? s[i - 1] : '2') << endl;
	// 		// dp[i][0] += (i == 0 ? 0 : (dp[i - 1][1] + (s[i - 1] == '1') ? (dp[i - 1][1] + 1 : 0))); 
	// 		dp[i][0] = (i - 1 >= 0 ? dp[i - 1][0] : 0) + (i == 0 ? 0 : ((s[i - 1] == '1') ? max(dp[i - 1][1],dp[i - 1][0]) + 1 : 0)); 
	// 		dp[i][1] = (i - 1 >= 0 ? dp[i - 1][0] : 0) + dp[i - 1][1] + (i == 0 ? 0 : ((s[i - 1] == '0') ? max(dp[i - 1][1],dp[i - 1][0]) + 1 : 0));
	// 	}else{
	// 		if(i - 1 >= 0 && s[i - 1] != '?'){
	// 			dp[i][0] = (i - 1 >= 0 ? dp[i - 1][0] : 0) + dp[i - 1][0] + (s[i] != s[i - 1]) ? max(dp[i - 1][1],dp[i - 1][0]) + 1 : 0;
	// 			dp[i][1] = (i - 1 >= 0 ? dp[i - 1][0] : 0) + dp[i - 1][1] +(s[i] != s[i - 1]) ? max(dp[i - 1][1],dp[i - 1][0]) + 1 : 0;
	// 		}else
	// 		{
	// 			// cout << (i - 1 >= 0 ? s[i - 1] : '2') << " " << dp[i - 1][0] << " " << dp[i - 1][1] << endl;
	// 			// dp[i][0] += (i == 0 ? 0 : (max(dp[i - 1][1], dp[i - 1][0]) + (s[i - 1] == '1')));
	// 			dp[i][0] = (i - 1 >= 0 ? dp[i - 1][0] : 0) + dp[i - 1][0] + (i == 0 ? 0 : ((s[i] == '1') ? (dp[i - 1][0]) + 1 : 0)); 
	// 			dp[i][1] = (i - 1 >= 0 ? dp[i - 1][0] : 0) + dp[i - 1][1] + (i == 0 ? 0 : ((s[i] == '0') ? (dp[i - 1][1]) + 1 : 0)); 
	// 			// dp[i][1] += (i == 0 ? 0 : (max(dp[i - 1][0], dp[i - 1][1]) + (s[i - 1] == '0')));
	// 		}
	// 	}
	// 	ans += (dp[i][0] + dp[i][1]);
	// 	cout << i << ": " << dp[i][0] << " " << dp[i][1] << endl;
	// }
	// cout << dp[n - 1][0] << " " << dp[n - 1][1] << endl;


	// Finally
 
	if(s[0] == '1')
		dp[0][1] = 1;
	if(s[0] == '0')
		dp[0][0] = 1;
	if(s[0] == '?')
		dp[0][0] = dp[0][1] = 1;
 
	for(ll i = 1;i < n;i++){
		if(s[i] == '1'){
			dp[i][1] += dp[i-1][0] + 1;
		}
		if(s[i] == '0'){
			dp[i][0] += dp[i - 1][1] + 1;
		}
		if(s[i] == '?'){
			dp[i][0] += dp[i-1][1] + 1;
			dp[i][1] += dp[i-1][0] +  1;
		}
	}
 
	for(ll i = 0;i < n;i++){
		ans += max(dp[i][0],dp[i][1]);
	}
	return ans;
}

signed main(){
	ll t;
	cin >> t;
	while(t--){
		string s;
		cin >> s;
		ll n = s.length();
		ll onelen = 0;
		// for(ll i = 0; i < n; ++i){
		// 	if(s[i] != '?'){
		// 		onelen++;
		// 	}
		// }

		// ll ans = solve(s, 0);
		// cout << ans << endl;
		// ans += solve(s, 1);
		// cout << ans << endl;
		// ans += onelen;

		ll ans = solve(s);
		// cout << ans << endl;
		// ans += onelen;

		// cout << "Ans: ";
		cout << ans << endl;
	}
	return 0;
}