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 }

 

 

posted @ 2012-10-09 00:49  proverbs  阅读(1124)  评论(0编辑  收藏  举报