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 }
没有人能阻止我前进的步伐,除了我自己!