poj 2887 big string (块状链表)

第一次写块状链表,
#include <iostream>  
#include <cstdio>  
#include <cstring>  
#include <vector>  
#include <algorithm>  
  
using namespace std;  
  
#define maxn 1001  
  
char s[maxn*maxn];  
char a[maxn][maxn*3]; //插入最多2000次,每行最多3000个  
int len[maxn];  //记录每一行字符个数  
const int b = 1000; //默认分成最多1000行  
int row; //共几行  
  
char query(int k) //查询第k个  
{  
    int cnt = 0;  
    for(int i = 0; i < row; i++){  
        if(cnt+len[i]>= k){//如果扫描到第k个字符所在的哪一行  
            return a[i][k-cnt-1];  //返回第k个字符 
        }  
        cnt+=len[i];  //累加cnt,即第k个字符所在行的前面若干行 
    }  
}  
  
void add(char ch, int k) //插入到第k个  
{  
    int cnt = 0;  
    int r;  
    for(int i = 0; i < row; i++){  
        if(cnt+len[i] >= k){  
            r = i;  
            break;  
        }  
        if(i == row-1) {r = row-1; break;}  
        cnt+=len[i];  
    }  //同query函数 
  
    int pos = k-cnt-1;  
    if(pos >= len[r]) pos = len[r];  
    for(int i = len[r]; i >= pos+1; i--)  
        a[r][i] = a[r][i-1];//插入之后后移所在行的所有字符一位 
    a[r][pos] = ch;  
    len[r]++;  
  
}  
  
int main()  
{  
    while(scanf("%s", s)==1){  
             memset(len, 0, sizeof(len));  
            int slen = strlen(s);  
            int perl = (slen+b-1)/b; //每行保存的字符个数  
  
            row = (slen-1)/perl+1; //共多少行  
            for(int i = 0; i < row; i++) len[i] = perl;  
            for(int i = 0; i < slen; i++)  
                a[i/perl][i%perl] = s[i];  
            len[row-1] = (slen-1)%perl+1;  
  
            int n;  
            scanf("%d", &n);  
            while(n--){  
                char op[3];  
                int k;  
  
                scanf("%s", op);  
                if(op[0] == 'Q'){  
                    scanf("%d", &k);  
                    printf("%c\n", query(k));  
                }  
                else{  
                    scanf("%s %d", op, &k);  
                    add(op[0], k);  
                }  
            }  
    }  
    return 0;  
}  


磕磕盼盼写出来,还是看着别人的代码,唉,实力弱的一笔。其实块状链表还是挺好理解的,就是把总的数据按照sqart(n)储存。这样对于数据进行操作室会节省大量的时间。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值