#include <cstdio>
#include <cstring>
const int MAXN = 1000000 + 123;
struct node
{
int id, val;
node(int x, int y): id(x), val(y) {}
node(){}
}q[MAXN * 2];
char str[MAXN];
int d[MAXN * 2];
bool used[MAXN];
int main()
{
int T;
scanf("%d", &T);
int cas = 1;
while(T--)
{
scanf("%s", str);
d[0] = 0;
int n = strlen(str);
memset(used, 0, sizeof(used));
for(int i = 1; i <= n; i++)
if(str[i - 1] == 'C') d[i] = d[i - 1] + 1;
else d[i] = d[i - 1] - 1;
for(int i = n + 1; i <= n + n; i++)
if(str[i - 1 - n] == 'C') d[i] = d[i - 1] + 1;
else d[i] = d[i - 1] - 1;
int head = 0, tail = -1;
int leave = 0;
for(int i = 1; i <= n; i++) //向右走
{
while(tail >= head && q[tail].val >= d[i]) tail--;
node now(i, d[i]);
q[++tail] = now;
}
for(int i = n + 1; i <= n + n; i++)
{
while(tail > head && q[head].id <= leave) head++;
node t = q[head];
if(d[t.id] - d[leave] >= 0)
{
used[i - n - 1] = 1;
}
leave++;
while(tail >= head && q[tail].val >= d[i]) tail--;
node now(i, d[i]);
q[++tail] = now;
}
d[0] = 0;
for(int i = 1; i <= n; i++) //向左走
if(str[n - i] == 'C') d[i] = d[i - 1] + 1;
else d[i] = d[i - 1] - 1;
for(int i = n + 1; i <= n + n; i++)
if(str[n + n - i] == 'C') d[i] = d[i - 1] + 1;
else d[i] = d[i - 1] - 1;
head = 0;
tail = -1;
leave = 0;
for(int i = 1; i <= n; i++)
{
while(tail >= head && q[tail].val >= d[i]) tail--;
node now(i, d[i]);
q[++tail] = now;
}
int kk;
for(int i = n + 1; i <= n + n; i++)
{
while(tail > head && q[head].id <= leave) head++;
node t = q[head];
if(d[t.id] - d[leave] >= 0)
{
if(leave == 0 ) kk = 0;
else kk = n + n - i + 1 ;
used[kk] = 1;
}
leave++;
while(tail >= head && q[tail].val >= d[i]) tail--;
node now(i, d[i]);
q[++tail] = now;
}
int ans = 0;
for(int i = 0; i < n; i++)
if(used[i]) ans++;
printf("Case %d: %d\n",cas++,ans);
}
return 0;
}
HDU 3474 Necklace //单调队列
最新推荐文章于 2020-01-11 20:46:59 发布