//hdu 3474 Necklace(单调队列)
/*
这是我照着别人,敲单调队列
*/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=1000008*2;
char str[N],temp[N];
int que[N],sum[N];
bool flag1[N],flag2[N];
int len;
void monquery(int d)
{
int n,m=0,head=0,tail=0;
sum[0]=0;n=len*2;
for(int i=1;i<=n;i++)
{
if(str[i]=='C')
sum[i]=sum[i-1]+1;
else
sum[i]=sum[i-1]-1;
}
for(int i=0;i<n;i++)
{
while(head<tail&&sum[i]<sum[que[tail-1]])
{
tail--;
}
que[tail++]=i;
}
for(int i=len;i<=n;i++)
{
while(head<tail&&sum[i]<sum[que[tail-1]])
{
tail--;
}
que[tail++]=i;
while(i-que[head]>=len) head++;
if(sum[i-len]<=sum[que[head]])
{
if(d)
flag1[i-len]=true;
else
flag2[i-len]=true;
}
}
}
int main()
{
int t;
scanf("%d",&t);
for(int k=1;k<=t;k++)
{
memset(flag1,false,sizeof(flag1));
memset(flag2,false,sizeof(flag2));
printf("Case %d: ",k);
scanf("%s",temp);
len=strlen(temp);
strcpy(str+1,temp);
strcat(str+1,temp);
monquery(1);
strrev(str+1);
monquery(0);
//puts(str);
//puts(temp);
int ans=0;
for(int i=0;i<len;i++)
{
if(flag1[i]||flag2[len-i])
{
ans++;
}
}
printf("%d\n",ans);
}
return 0;
}
hdu 3474 Necklace(单调队列)
最新推荐文章于 2019-06-24 02:18:07 发布