【HDU】3474 Necklace

 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 }

你可能感兴趣的:(HDU)