1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 #define MAXN 2000010 5 char s[MAXN]; 6 int n,len,q[MAXN],sum[MAXN]; 7 bool ok[2][MAXN]; 8 void Read() 9 { 10 int i; 11 scanf(" %s",s+1); 12 len=strlen(s+1); 13 for(i=1;i<=len;i++) 14 s[i+len]=s[i]; 15 n=len<<1; 16 } 17 void DoIt(int k) 18 { 19 int i,front,rear; 20 sum[0]=0; 21 for(i=1;i<=n;i++) 22 { 23 if(s[i]=='C') 24 sum[i]=sum[i-1]+1; 25 else 26 sum[i]=sum[i-1]-1; 27 } 28 front=0; 29 rear=-1; 30 for(i=1;i<len;i++) 31 { 32 for(;front<=rear&&sum[q[rear]]>=sum[i];rear--); 33 q[++rear]=i; 34 } 35 for(;i<=n;i++) 36 { 37 for(;front<=rear&&i-q[front]>=len;front++); 38 for(;front<=rear&&sum[q[rear]]>=sum[i];rear--); 39 q[++rear]=i; 40 ok[k][i-len]=(sum[q[front]]>=sum[i-len]); 41 } 42 } 43 int main() 44 { 45 int c,i,cnt,ca=1; 46 scanf("%d",&c); 47 while(c--) 48 { 49 Read(); 50 DoIt(0); 51 reverse(s+1,s+1+n); 52 DoIt(1); 53 for(i=cnt=0;i<len;i++) 54 { 55 if(ok[0][i]||ok[1][len-i]) 56 cnt++; 57 } 58 printf("Case %d: %d\n",ca++,cnt); 59 } 60 return 0; 61 }
![](https://img2024.cnblogs.com/blog/35695/202408/35695-20240826070647288-243310440.jpg)