1
+ #include < bits/stdc++.h>
2
+ #define all (x ) x.begin(),x.end()
3
+ #define msg (str,str2 ) cout << str << str2<< endl
4
+ using namespace std ;
5
+
6
+ using ll = long long ;
7
+ using ld = long double ;
8
+ using uint = unsigned int ;
9
+ using ull = unsigned long long ;
10
+ template <typename T>
11
+ using pair2 = pair<T, T>;
12
+ using pii = pair<int , int >;
13
+ using pli = pair<ll, int >;
14
+ using pll = pair<ll, ll>;
15
+
16
+ #define pb push_back
17
+ #define mp make_pair
18
+
19
+ int gcd (int a,int b){
20
+ if (a%b==0 ) return b;
21
+ else return gcd (b,a%b);
22
+ }
23
+
24
+ clock_t startTime;
25
+ double getCurrentTime () {
26
+ return (double )(clock () - startTime) / CLOCKS_PER_SEC;
27
+ }
28
+
29
+ void solve (){
30
+ int n; cin>>n;
31
+ string s; cin>>s;
32
+ vector<int > vec (n);
33
+ for (int e = 0 ; e < n; e++){
34
+ vec[e] = s[e] - ' 0' ;
35
+ }
36
+
37
+ // for(int e = 0 ; e <n; e++){
38
+ // cout << vec[e]<< " ";
39
+ // }cout << endl;
40
+
41
+ // prefix sum
42
+ for (int e = 1 ; e <n; e++){
43
+ vec[e] = vec[e-1 ]+ vec[e];
44
+ }
45
+
46
+ // for(int e = 0 ; e <n; e++){
47
+ // cout << vec[e]<< " ";
48
+ // }cout << endl;
49
+ vector<int > modulo3 (n);
50
+ for (int e = 0 ;e < n ; e++){
51
+ modulo3[e] = vec[e]%3 ;
52
+ }
53
+ vector<int > ceros (n),unos (n),dos (n);
54
+ // ceros
55
+ if (modulo3[0 ] == 0 ) ceros[0 ] = 1 ;
56
+ else ceros[0 ] = 0 ;
57
+ for (int e = 1 ; e < n; e++){
58
+ if (modulo3[e] == 0 ){
59
+ ceros[e] = ceros[e-1 ] +1 ;
60
+ }else {
61
+ ceros[e] = ceros[e-1 ] + 0 ;
62
+ }
63
+ }
64
+ // unos
65
+ if (modulo3[0 ] == 1 ) unos[0 ] = 1 ;
66
+ else unos[0 ] = 0 ;
67
+ for (int e = 1 ; e < n; e++){
68
+ if (modulo3[e] == 1 ){
69
+ unos[e] = unos[e-1 ] +1 ;
70
+ }else {
71
+ unos[e] = unos[e-1 ] + 0 ;
72
+ }
73
+ }
74
+ // dos
75
+ if (modulo3[0 ] == 2 ) dos[0 ] = 1 ;
76
+ else dos[0 ] = 0 ;
77
+ for (int e = 1 ; e < n; e++){
78
+ if (modulo3[e] == 2 ){
79
+ dos[e] = dos[e-1 ] +1 ;
80
+ }else {
81
+ dos[e] = dos[e-1 ] + 0 ;
82
+ }
83
+ }
84
+ // cout << "prints:" << endl;
85
+ // for(int e = 0 ; e < n; e++){
86
+ // cout << ceros[e] << " ";
87
+ // }cout << endl;
88
+ // for(int e = 0 ; e < n; e++){
89
+ // cout << unos[e] << " ";
90
+ // }cout << endl;
91
+
92
+ // for(int e = 0 ; e < n; e++){
93
+ // cout << dos[e] << " ";
94
+ // }cout << endl;
95
+
96
+ int cont = 0 ;
97
+ for (int e = 1 ;e < n ; e++){
98
+ if (vec[e]%3 == 0 ){
99
+ cont += ceros[e-1 ];
100
+ }else if (vec[e]%3 ==1 ){
101
+ cont += unos[e-1 ];
102
+ }else {
103
+ // vec[e]%3==2
104
+ cont += dos[e-1 ];
105
+ }
106
+ }
107
+ for (int e = 0 ;e < n ; e++){
108
+ if (vec[e]%3 ==0 ) cont++;
109
+ }
110
+ cout << cont << endl;
111
+
112
+
113
+ }
114
+
115
+ int main (){
116
+ ios_base::sync_with_stdio (false );
117
+ cin.tie (0 );
118
+ int t; cin>>t;
119
+ while (t--)solve ();
120
+ return 0 ;
121
+ }
0 commit comments