cf C. Sereja and Algorithm

http://codeforces.com/contest/368/problem/C

从左向右记录从1位置到每一个位置上x,y,z的个数。然后判断在l,r区间内的x,y,z的关系满不满足abs(x-y)<=1&&abs(x-z)<=1&&abs(y-z)<=1,满足输出YES,否则输出NO。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #define maxn 200000
 5 using namespace std;
 6 
 7 char str[maxn];
 8 int hx[maxn],hy[maxn],hz[maxn];
 9 int m;
10 int l,r;
11 
12 int main()
13 {
14     while(scanf("%s",str)!=EOF)
15     {
16         int t1=0,t2=0,t3=0;
17         memset(hx,0,sizeof(hx));
18         memset(hy,0,sizeof(hy));
19         memset(hz,0,sizeof(hz));
20         int len=strlen(str);
21         for(int i=0; i<len; i++)
22         {
23             if(str[i]=='x')
24             {
25                 t1++;
26                 hx[i+1]=t1;
27                 hy[i+1]=t2;
28                 hz[i+1]=t3;
29             }
30             else if(str[i]=='y')
31             {
32                 t2++;
33                 hx[i+1]=t1;
34                 hy[i+1]=t2;
35                 hz[i+1]=t3;
36             }
37             else if(str[i]=='z')
38             {
39                 t3++;
40                 hx[i+1]=t1;
41                 hy[i+1]=t2;
42                 hz[i+1]=t3;
43             }
44         }
45         scanf("%d",&m);
46         for(int i=1; i<=m; i++)
47         {
48             scanf("%d%d",&l,&r);
49             int len=r-l+1;
50             if(len<3)
51             {
52                 printf("YES\n");
53                 continue;
54             }
55             else
56             {
57                 int x=hx[r]-hx[l-1];
58                 int y=hy[r]-hy[l-1];
59                 int z=hz[r]-hz[l-1];
60                 if(abs(x-y)<=1&&abs(x-z)<=1&&abs(y-z)<=1)
61                 {
62                     printf("YES\n");
63                 }
64                 else printf("NO\n");
65             }
66         }
67     }
68     return 0;
69 }
View Code

 

posted @ 2014-09-06 19:16  null1019  阅读(174)  评论(0编辑  收藏  举报