• POJ 2887 块状数组


    题意:

    在字符串中的pos位置插入字符串,询问pos位置的字母是谁

    思路:

    裸的块状数组,第一次写,“借鉴”了别人的,比我自己yy的短多了。。。

    自己yy的又长又臭,效率还低,就给出别人的吧。。

    PS:真心觉得块状数组是个好东西。。。

    View Code
     1 #include <cstdio>
     2 #include <cmath>
     3 #include <cstring>
     4 #include <cstdlib>
     5 #include <algorithm>
     6 #include <iostream>
     7 
     8 #define N 5000
     9 
    10 using namespace std;
    11 
    12 struct BK
    13 {
    14     int size,next;
    15     char s[N];
    16     void push(char str)
    17     {
    18         s[size++]=str;
    19     }
    20     void insert(int pos,char str)
    21     {
    22         for(int i=size++;i>pos;i--) s[i]=s[i-1];
    23         s[pos]=str;
    24     }
    25 }bk[N];
    26 
    27 char a[4000000];
    28 int lena,m,bsize,cnt;
    29 
    30 void read()
    31 {
    32     gets(a);
    33     lena=strlen(a);
    34     scanf("%d",&m);
    35     bsize=(int)sqrt((double)(lena+m));
    36     cnt=0;
    37     bk[cnt].size=0;
    38     for(int i=0;i<lena;i++)
    39     {
    40         if(bk[cnt].size==bsize)
    41         {
    42             bk[cnt].next=cnt+1;
    43             bk[++cnt].size=0;
    44         }
    45         bk[cnt].push(a[i]);
    46     }
    47     bk[cnt].next=-1;
    48 }
    49 
    50 void updata(int u)
    51 {
    52     if(bk[u].size<2*bsize) return;
    53     ++cnt;
    54     int i,j,k=bk[u].size;
    55     for(i=bsize,j=0;i<k;i++,j++) bk[cnt].s[j]=bk[u].s[i];
    56     bk[cnt].size=j;
    57     bk[u].size=bsize;
    58     bk[cnt].next=bk[u].next;
    59     bk[u].next=cnt;
    60 }
    61 
    62 void go()
    63 {
    64     for(int i=1,pos,j;i<=m;i++)
    65     {
    66         scanf("%s",a);
    67         if(a[0]=='Q')
    68         {
    69             scanf("%d",&pos);
    70             for(j=0;pos>bk[j].size;j=bk[j].next) pos-=bk[j].size;
    71             printf("%c\n",bk[j].s[pos-1]);
    72         }
    73         else 
    74         {
    75             scanf("%s%d",a,&pos);
    76             for(j=0;pos>bk[j].size&&bk[j].next!=-1;j=bk[j].next) pos-=bk[j].size;
    77             bk[j].insert(min(pos-1,bk[j].size+1),a[0]);
    78             updata(j);
    79         }
    80     }
    81 }
    82 
    83 int main()
    84 {
    85     read();
    86     go();
    87     return 0;
    88 }
    没有人能阻止我前进的步伐,除了我自己!
  • 相关阅读:
    单调栈
    单调队列
    线段树
    树状数组
    KMP模式匹配
    二分图最大匹配
    celery发送短信接口
    celery配置与基本使用
    celery介绍
    短信验证接口
  • 原文地址:https://www.cnblogs.com/proverbs/p/2716009.html
Copyright © 2020-2023  润新知