
#include <bits/stdc++.h>
using namespace std;
#define ll long long int
ll gcd(ll a, ll b)
    {
      if (b == 0)
        return a;
      return gcd(b, a % b);
    }
  void print(vector<ll> &arr){
        for(int i=0;i<arr.size();i++){
            cout<<arr[i]<<" ";
        }
        cout<<endl;
    }
ll fun(string s,ll n){
   // print(a);
    ll count = 1;
    // vector<ll> arr;
    // for(int i=0;i<n;i++){
    //     if(a[i]%2==0){
    //      arr.push_back(a[i]);   
    //     }
    // }
    // for(int i=0;i<n;i++){
    //     if(a[i]%2==1){
    //         arr.push_back(a[i]);
    //     }
    // }
    // for(int i=0;i<n;i++){
    //     for(int j=i+1;j<n;j++){
    //         if(gcd(arr[i],2*arr[j])>1){
    //             count++;
    //         }
    //     }
    // }
  
    vector<ll> zero(n,-1);
    vector<ll> one(n,-1);
    for(ll i=0;i<n;i++){
        if(s[i]=='0'){
            zero[i]=i;
        }
        else{
            if(i){
                zero[i]=zero[i-1];
            }
        }
    }
    for(ll i=0;i<n;i++){
        if(s[i]=='1'){
            one[i]=i;
        }
        else{
            if(i){
                one[i]=one[i-1];
            }
        }
    }
      vector<ll> arr(n);
    arr[0]=0;
    for(ll i=1;i<n;i++){
        // #include <bits/stdc++.h>
// using namespace std;
// #define ll long long int
// bool fun(ll a1,ll a2,ll a3,ll a4){
//  priority_queue<ll> pq;
//  pq.push(a1);
//  pq.push(a2);
//  pq.push(a3);
//  pq.push(a4);
//  unordered_set<ll> set1;
//   unordered_set<ll> set2;
//  set1.insert(pq.top());
//  pq.pop();
//  set1.insert(pq.top());
//  pq.pop();
//  set2.insert(max(a1,a2));
//  set2.insert(max(a3,a4));
//  return set1==set2;
// }
// int main() {
// 	ll t;
// 	cin>>t;
// 	while(t--){
// 	    ll a1,a2,a3,a4;
// 	    cin>>a1>>a2>>a3>>a4;
// 	    if(fun(a1,a2,a3,a4)==true){
// 	        cout<<"YES"<<endl;
// 	    }
// 	    else{
// 	        cout<<"NO"<<endl;
// 	    }
// 	}
// 	return 0;
// }

        if(s[i]=='?'){
            arr[i]=arr[i-1];
        }
        else if(s[i]=='1'){
            if(zero[i-1]==one[i-1]){
                arr[i]=0;
            }
            else if(zero[i-1]>one[i-1]){
                ll k=zero[i-1];
                if((k & 1) != (i & 1)){
                    arr[i]=arr[k];
                }
                else{
                    arr[i]=k+1;
                }
            }
            else{
                ll k=one[i-1];
                if((k & 1) == (i & 1)){
                    arr[i]=arr[k];
                }
                else{
                    arr[i]=k+1;
                }
            }
        }
        else{
            if(zero[i-1]==one[i-1]){
                arr[i]=0;
            }
            else if(zero[i-1]>one[i-1]){
                ll k=zero[i-1];
                if((k & 1) == (i & 1)){
                    arr[i]=arr[k];
                }
                else{
                    arr[i]=k+1;
                    // #include <bits/stdc++.h>
// using namespace std;
// #define ll long long int
// bool fun(ll a1,ll a2,ll a3,ll a4){
//  priority_queue<ll> pq;
//  pq.push(a1);
//  pq.push(a2);
//  pq.push(a3);
//  pq.push(a4);
//  unordered_set<ll> set1;
//   unordered_set<ll> set2;
//  set1.insert(pq.top());
//  pq.pop();
//  set1.insert(pq.top());
//  pq.pop();
//  set2.insert(max(a1,a2));
//  set2.insert(max(a3,a4));
//  return set1==set2;
// }
// int main() {
// 	ll t;
// 	cin>>t;
// 	while(t--){
// 	    ll a1,a2,a3,a4;
// 	    cin>>a1>>a2>>a3>>a4;
// 	    if(fun(a1,a2,a3,a4)==true){
// 	        cout<<"YES"<<endl;
// 	    }
// 	    else{
// 	        cout<<"NO"<<endl;
// 	    }
// 	}
// 	return 0;
// }

                }
            }
            else{
                ll k=one[i-1];
                if((k & 1) != (i & 1)){
                    arr[i]=arr[k];
                }
                else{
                    arr[i]=k+1;
                }
                // #include <bits/stdc++.h>
// using namespace std;
// #define ll long long int
// bool fun(ll a1,ll a2,ll a3,ll a4){
//  priority_queue<ll> pq;
//  pq.push(a1);
//  pq.push(a2);
//  pq.push(a3);
//  pq.push(a4);
//  unordered_set<ll> set1;
//   unordered_set<ll> set2;
//  set1.insert(pq.top());
//  pq.pop();
//  set1.insert(pq.top());
//  pq.pop();
//  set2.insert(max(a1,a2));
//  set2.insert(max(a3,a4));
//  return set1==set2;
// }
// int main() {
// 	ll t;
// 	cin>>t;
// 	while(t--){
// 	    ll a1,a2,a3,a4;
// 	    cin>>a1>>a2>>a3>>a4;
// 	    if(fun(a1,a2,a3,a4)==true){
// 	        cout<<"YES"<<endl;
// 	    }
// 	    else{
// 	        cout<<"NO"<<endl;
// 	    }
// 	}
// 	return 0;
// }

            }
        }
        count += (i-arr[i]+1);
    }
    return count;
}
int main() {
	ll t;
	cin>>t;
	while(t--){
	    string s;
	    cin>>s;
	    ll n = s.length();
	    cout<<fun(s,n)<<endl;
	}
	return 0;
}
