POJ2887(块状链表)

Big String
Time Limit: 1000MS   Memory Limit: 131072K
Total Submissions: 6346   Accepted: 1525

Description

You are given a string and supposed to do some string manipulations.

Input

The first line of the input contains the initial string. You can assume that it is non-empty and its length does not exceed 1,000,000.

The second line contains the number of manipulation commands N (0 < N ≤ 2,000). The following N lines describe a command each. The commands are in one of the two formats below:

  1. I ch p: Insert a character ch before the p-th character of the current string. If p is larger than the length of the string, the character is appended to the end of the string.
  2. Q p: Query the p-th character of the current string. The input ensures that the p-th character exists.

All characters in the input are digits or lowercase letters of the English alphabet.

Output

For each Q command output one line containing only the single character queried.

Sample Input

ab
7
Q 1
I c 2
I d 4
I e 2
Q 5
I f 1
Q 3

Sample Output

a
d
e
标准块状链表.
复制代码
#include"cstdio"
#include"cstring"
#include"cmath"
#include"algorithm"
using namespace std;
const int MAXN=1005;
char str[MAXN*MAXN];
struct Block_List{
    int size,next;
    char s[2*MAXN];
    Block_List()
    {
        memset(s,0,sizeof(s));
        size=0;
        next=-1;
    }
    
    void push(char ch)
    {
        s[size++]=ch;
    }
    
    void insert(int pos,char ch)
    {
        for(int i=size;i>pos;i--)
        {
            s[i]=s[i-1];
        }
        s[pos]=ch;
        size++;    
    }
}bkl[MAXN];

int bsize,cnt,m;
void Init()
{
    gets(str);
    scanf("%d",&m);
    bsize=(int)sqrt(double(strlen(str)+m));
    for(int i=0;str[i];i++)
    {
        if(bkl[cnt].size==bsize)
        {
            bkl[cnt].next=cnt+1;
            cnt++;
        }
        bkl[cnt].push(str[i]);
    }
    cnt++;
}

void Update(int u)
{
    if(bkl[u].size<2*bsize)    return ;
    /*
    for(int i=bsize;i<bkl[u].size;i++)
    {
        bkl[cnt].push(bkl[u].s[i]);
    }
    */
    strcpy(bkl[cnt].s,bkl[u].s+bsize);
    bkl[cnt].size=strlen(bkl[u].s)-bsize;
    bkl[u].size=bsize;
    bkl[cnt].next=bkl[u].next;
    bkl[u].next=cnt;
    cnt++;
}
void handle()
{
    int cas=0;
    while(++cas<=m)
    {
        char op[5];
        scanf("%s",op);
        if(op[0]=='Q')
        {
            int pos;
            scanf("%d",&pos);
            int i;
            for(i=0;pos>bkl[i].size;i=bkl[i].next)
            {
                pos-=bkl[i].size;
            }
            printf("%c\n",bkl[i].s[pos-1]);
        }
        else
        {
            char ch[5];
            int pos;
            scanf("%s%d",ch,&pos);
            int i;
            for(i=0;pos>bkl[i].size&&bkl[i].next!=-1;i=bkl[i].next)
            {
                pos-=bkl[i].size;
            }
            bkl[i].insert(pos-1,ch[0]);
            Update(i);
        }
    }
}
int main()
{
    Init();
    handle();    
    return 0;
}
复制代码

 

posted on   vCoders  阅读(505)  评论(0编辑  收藏  举报

努力加载评论中...
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示