zoukankan      html  css  js  c++  java
  • poj 2887 Big String(块状链表)

    题目链接:poj 2887 Big String

    题意:

    让你设计一个数据结构,支持将一个字符插在p位置,询问第p个字符。

    题解:

    块状链表搞搞就行。

      1 #include<cstdio>
      2 #include<queue>
      3 #include<cmath>
      4 #include<cstring>
      5 #define F(i,a,b) for(int i=(a);i<=(b);++i)
      6 using namespace std;
      7 
      8 const int N=1100000,SQR=1510;
      9 struct Node{
     10     int a[1600],sz,pre,nxt;
     11     void clear(){sz=pre=nxt=0;}
     12     inline void pb(int x){a[++sz]=x;}
     13     inline void ins(int pos,int x){
     14         for(int i=++sz;i>pos;i--)a[i]=a[i-1];
     15         a[pos]=x;
     16     }
     17     void del(int pos){sz--;F(i,pos,sz)a[i]=a[i+1];}
     18 }T[1600];
     19 struct Block{
     20     int head,tail,sz;
     21     queue<int>Q;
     22     void clear(){
     23         head=tail=sz=0;
     24         while(!Q.empty())Q.pop();
     25         F(i,1,SQR)Q.push(i);
     26     }
     27     int nw(){int t=Q.front();Q.pop(),T[t].clear();return t;}
     28     inline int find(int &x){
     29         int i=head;
     30         while(i&&x>T[i].sz)x-=T[i].sz,i=T[i].nxt;
     31         return i==0?(x+=T[tail].sz),tail:i;
     32     }
     33     int& operator[](int x){
     34         int now=find(x);
     35         if(x>T[now].sz)x=0;
     36         return T[now].a[x];
     37     }
     38     void split(int x)
     39     {
     40         int New=nw();
     41         T[New].pre=x,T[New].nxt=T[x].nxt;
     42         T[T[x].nxt].pre=New,T[x].nxt=New;
     43         F(i,SQR/2,T[x].sz)T[New].pb(T[x].a[i]);
     44         T[x].sz=SQR/2-1;
     45         if(x==tail)tail=New;
     46     }
     47     void merge(int x)
     48     {
     49         int nxt=T[x].nxt;
     50         if(nxt&&T[x].sz+T[nxt].sz<SQR)
     51         {
     52             F(i,1,T[nxt].sz)T[x].pb(T[nxt].a[i]);
     53             T[x].nxt=T[nxt].nxt,T[T[nxt].nxt].pre=x;
     54             Q.push(nxt);
     55             if(nxt==tail)tail=x;
     56         }
     57     }
     58     inline void check(int x){
     59         if(T[x].sz>SQR)split(x);
     60         if(T[x].sz<SQR/2)merge(x);
     61     }
     62     inline void pb(int x)
     63     {
     64         if(!tail)head=tail=nw();
     65         if(T[tail].sz>=SQR)
     66         {
     67             int t=nw();T[tail].nxt=t;
     68             T[t].pre=tail,tail=t;
     69         }
     70         T[tail].pb(x),sz++;
     71     }
     72     void ins(int pos,int x,int now=0)
     73     {
     74         sz++;if(pos>sz)pos=sz;
     75         if(!head){head=tail=nw(),T[head].pb(x);return;}
     76         now=find(pos),T[now].ins(pos,x),check(now);
     77     }
     78     void delet(int pos)
     79     {
     80         if(pos>sz)return;
     81         int now=find(pos);
     82         T[now].del(pos),check(now),sz--;
     83     }
     84 }B;
     85 
     86 char s[N];
     87 int n;
     88 int main(){
     89     while(~scanf("%s",s))
     90     {
     91         B.clear();
     92         for(int i=0;s[i];i++)B.pb(s[i]);
     93         scanf("%d",&n);
     94         F(i,1,n)
     95         {
     96             char op[2],str[2];int pos;
     97             scanf("%s",op);
     98             if(*op=='I')
     99             {
    100                 scanf("%s%d",str,&pos);
    101                 B.ins(pos,*str);
    102             }else
    103             {
    104                 scanf("%d",&pos);
    105                 printf("%c
    ",B[pos]);
    106             }
    107         }
    108     }
    109     return 0;
    110 }
    View Code
  • 相关阅读:
    (转) 将VB.NET网站转换成C#的全过程
    vb.net转换为C#方法
    (转)使用Microsoft Web Application Stress Tool对web进行压力测试
    (转)js 中{},[]中括号,大括号使用详解
    (转)js学习笔记()函数
    (转)几种HtmlEncode的区别
    编译Redis系统提示缺少gcc,可以使用yum进行安装:
    linux如何关闭防火墙
    Linux less命令简介
    Linux unzip解压文件到某个目录下面
  • 原文地址:https://www.cnblogs.com/bin-gege/p/7354704.html
Copyright © 2011-2022 走看看