• hdu 4046 Panda


    题目大意:对于一个给定的字符串(有‘b’和‘w’组成),求其中“wbw”的数目。

    这题刚开始做时没什么思路,或许跟我本来就讨厌字符串这类题有关吧。好,废话少说,讲讲思路吧。

    这题其实是考线段树的,单点更新,区间合并。合并时要注意一下边界,详细的还是自己看看代码吧。

    View Code
     1 #include <stdio.h>
     2 #define lson l,m,rt<<1
     3 #define rson m+1,r,rt<<1|1
     4 #define maxn 50000 
     5 struct node
     6 {
     7     int cnt;
     8 }setree[maxn<<2];
     9 char s[50005];
    10 void pushup(int rt,int len,int m,int l,int r)
    11 {
    12     setree[rt].cnt=setree[rt<<1].cnt+setree[rt<<1|1].cnt;
    13     if(len>2){
    14         if(s[m-1]=='w'&&s[m]=='b'&&s[m+1]=='w'&&m>l)
    15         setree[rt].cnt++;
    16         else if(s[m]=='w'&&s[m+1]=='b'&&s[m+2]=='w'&&m<r-1)
    17         setree[rt].cnt++;
    18     }
    19 }
    20 void build(int l,int r,int rt)
    21 {
    22     if(l==r){
    23         setree[rt].cnt=0;
    24         return;
    25     }
    26     int m=(l+r)>>1;
    27     build(lson);
    28     build(rson);
    29     pushup(rt,r-l+1,m,l,r);
    30 }
    31 void update(int l,int r,int rt,int num)
    32 {
    33     if(l==r)
    34         return;
    35     int m=(l+r)>>1;
    36     if(num<=m)
    37         update(lson,num);
    38     else
    39         update(rson,num);
    40     pushup(rt,r-l+1,m,l,r);
    41 }
    42 int query(int l,int r,int rt,int L,int R)
    43 {
    44     if(L<=l&&r<=R)
    45     return setree[rt].cnt;
    46     int m=(l+r)>>1;
    47     if(R<=m)
    48     return query(lson,L,R);
    49     else if(L>m)
    50     return query(rson,L,R);
    51     else{
    52         int ans=query(lson,L,m)+query(rson,m+1,R);
    53         if(s[m-1]=='w'&&s[m]=='b'&&s[m+1]=='w'&&m>L&&m<R)
    54         ans++;
    55         else if(s[m]=='w'&&s[m+1]=='b'&&s[m+2]=='w'&&m>=L&&m<R-1)
    56         ans++;
    57         return ans;
    58     }
    59 }
    60 int main()
    61 {
    62     int t,cas=1;
    63     scanf("%d",&t);
    64     while(t--){
    65         int n,m;
    66         scanf("%d%d",&n,&m);
    67         scanf("%s",s);
    68         build(0,n-1,1);
    69         printf("Case %d:\n",cas++);
    70         while(m--){
    71             int op;
    72             scanf("%d",&op);
    73             if(op==1){
    74                 int num;
    75                 char opp[5];
    76                 scanf("%d%s",&num,opp);
    77                 s[num]=opp[0];
    78                 update(0,n-1,1,num);
    79             }
    80             else{
    81                 int l,r;
    82                 scanf("%d%d",&l,&r);
    83                 printf("%d\n",query(0,n-1,1,l,r));
    84             }
    85         }
    86     }
    87 }
  • 相关阅读:
    idea 导入maven项目各种红
    基于 Spring Security 的开源统一角色访问控制系统 URACS
    MySQL读写分离又一好办法 使用 com.mysql.jdbc.ReplicationDriver
    [转]CVS SVN VSS 使用对比
    推荐一个免费开源的虚拟机VBox(VirtualBox)
    JavaScript的对象属性的反射
    [转]需求分析的目的
    尝鲜安装iOS6及新特性
    EXP00003: 未找到段 (4,571) 的存储定义
    QQ邮箱里可以定阅博客园的文章了
  • 原文地址:https://www.cnblogs.com/kim888168/p/2776914.html
Copyright © 2020-2023  润新知