河南网站建设SEO优化制作设计公司,百度网址入口,户县微网站建设,尚品中国多年专注于高端网站建设题意:给出一字符串,然后有两种操作,在某个位置后面插入某个字符,查询更新后字符串中某个位置的字符。 这个题,需要用到一个神奇的数据结构:块状链表; 推荐论文可自学:对块状链表的一…
题意:给出一字符串,然后有两种操作,在某个位置后面插入某个字符,查询更新后字符串中某个位置的字符。
这个题,需要用到一个神奇的数据结构:块状链表;
推荐论文可自学:对块状链表的一点研究;
题中提到的两种操作都是非常理论的,可以直接套用块状链表的功能。高级的块状链表的维护操作会对根据某个块的大小做出裁决,是保留,是分裂,亦或是合并。但是这题的操作数量最多有2000。完全没有必要用这些操作,毕竟对于2000这样的数,计算机数着还是轻而易举的。而且题目的数据并没有卡维护,所以大胆省略代码,放弃一些时间也无所谓。(当然,如果大神追求完美的话,加上更好);
下面上代码:


1 //%%%%%%%%%%%%%尹兄 2 #include<iostream> 3 #include<cstdio> 4 #include<cstring> 5 #include<cmath> 6 #include<algorithm> 7 using namespace std; 8 const int MAXN=2005; 9 const int MAXM=1000005; 10 struct Blist{ 11 int siz;char da[MAXN]; 12 void pushback(char c){ 13 siz++;da[siz]=c; 14 } 15 void insert(int pos,char c){ 16 for(int i=siz+1;i>pos;i--) da[i]=da[i-1]; 17 da[pos]=c;siz++; 18 } 19 char getdata(int pos){ 20 return da[pos]; 21 } 22 }blist[MAXN]; 23 char ch[MAXM];int sum[MAXM],num,n,m; 24 void maintain(){ 25 for(int i=1;i<=num;i++) sum[i]=sum[i-1]+blist[i].siz; 26 } 27 void init(){ 28 num=sqrt((n+m)*1.0)+1; 29 for(int i=0;i<n;i++) blist[i/num+1].pushback(ch[i]);maintain(); 30 } 31 char query(int pos,int no){ 32 return blist[no].getdata(pos); 33 } 34 void insert(int pos,int no,char c){ 35 blist[no].insert(pos,c); 36 } 37 char myquery(int pos){ 38 int p=lower_bound(sum+1,sum+1+num,pos)-sum; 39 return query(pos-sum[p-1],p); 40 } 41 void myinsert(char c,int pos){ 42 int p=lower_bound(sum+1,sum+1+num,pos)-sum; 43 insert(pos-sum[p-1],p,c);maintain(); 44 } 45 int main(){ 46 scanf("%s",ch);n=strlen(ch);scanf("%d",&m); 47 init();char s[3],c[3];int p; 48 while(m--){ 49 scanf("%s",s); 50 if(s[0]=='Q') 51 scanf("%d",&p),printf("%c\n",myquery(p)); 52 else scanf("%s%d",c,&p),myinsert(c[0],p); 53 } 54 return 0; 55 }块状链表
转载于:https://www.cnblogs.com/Alan-Luo/articles/9452009.html