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

 

你可能感兴趣的:(Algorithm)