Now, your task is:
1. Choose an arbitrary position to cut it into a chain.
2. Choose either direction to collect it.
3. Collect all the beads in the chosen direction under the constraint that the number of crystal beads in your hand is not less than the jade at any time.
Calculate the number of ways to cut meeting the constraint
Then T lines follow, each line describes a necklace. ‘C’ stands for a crystal bead and ‘J’ stands for a jade bead. The length of necklace is between 2 and 10^6.
2 CJCJCJ CCJJCCJJCCJJCCJJ
Case 1: 6 Case 2: 8
//
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
/*首先计算从开始到i(0~2*len)点的C与J的数量之差sum[i]根据当
sum[i-len]<=Min(sum[j]|i-len<j<i)时符合题意要求*/
const int maxn=1000010;
char str[maxn*2];
int sum[maxn*2];//从1开始
int cnt;//answer
int len;
bool legal[2][maxn];
int Q[maxn*2];//单调队列
int I[maxn*2];//I[i]表示队列中的Q[i]在数组中的下标
void solve(int index)
{
int n=strlen(str+1);
sum[0]=0;
for(int i=1;i<=n;i++)
{
sum[i]=sum[i-1]+(str[i]=='C'?1:-1);
}
int head=1,tail=0;
for(int i=0;i<len;i++) //a[i]入队
{
while(head<=tail&&Q[tail]>=sum[i]) tail--;
tail++;
Q[tail]=sum[i],I[tail]=i;
}
for(int i=len;i<n;i++)
{
while(head<=tail&&Q[tail]>=sum[i]) tail--;
tail++;
Q[tail]=sum[i],I[tail]=i;
while(I[head]<=i-len) head++;
int rmin=Q[head];
legal[index][i-len]=sum[i-len]<=rmin;
//if(sum[i-len]<=rmin) cout<<index<<"..."<<i-len<<endl;
}
/*
int head=1,tail=0;
while(head<=tail&&Q[tail]>=a[i]) tail--;//a[i]入队
tail++;
Q[tail]=a[i],I[tail]=i;
while(I[head]<=i-k) head++;//a[i-k]出队
_min[i]=Q[head];//保存
*/
}
void _strev(char* str)
{
for(int i=0,j=strlen(str)-1;i<j;i++,j--)
{
char t=str[i];
str[i]=str[j];
str[j]=t;
}
}
int main()
{
int ci,pl=1;scanf("%d",&ci);
while(ci--)
{
scanf("%s",str+1);
len=strlen(str+1);
for(int i=len+1;i<=len+len;i++) str[i]=str[i-len];
str[len+len+1]='\0';
memset(legal,0,sizeof(legal));
solve(0);
_strev(str+1);
solve(1);
cnt=0;
for(int i=0;i<len;i++)
{
if(legal[0][i]||legal[1][(len-i)%len])
{
cnt++;
}
}
printf("Case %d: %d\n",pl++,cnt);
}
return 0;
}