【悬关】块状链表 WA on #1 #4 #5 #9 #10求助
查看原帖
【悬关】块状链表 WA on #1 #4 #5 #9 #10求助
305928
zhoumurui楼主2025/7/31 16:28

如题。本题块状数组做法,pointer 维护的是光标左侧的位置。

#include<bits/stdc++.h>
#define int long long
using namespace std;
struct node{
    char a[2005];
    int cnt;
    node* nxt;
    node* pre;
    node(){cnt=0;nxt=pre=NULL;}
    void push_back(char x){
        a[++cnt]=x;
    }
    void rebuild(){
        node* ne=new node;
        node* nn=nxt;
        if (nn!=NULL)nn->pre=ne;
        ne->nxt=nn;ne->pre=this,nxt=ne;
        
        for (int i=1001;i<=cnt;i++)ne->push_back(a[i]);
        cnt=1000;
    }
    int insert(int k,char x){
        for (int i=cnt;i>=k;i--)a[i+1]=a[i];
        a[k]=x;++cnt;
        if (cnt>=2000){
            rebuild();
            return 1;
        }
        else return 0;
    }
    void del(int k){
        for (int i=k;i<cnt;i++)a[i]=a[i+1];
        --cnt;
    }
}a;
struct pointer{
    node* now;int id;
    void move(int n){
        if (n<0){
            id+=n;
            while (id<0){
                now=now->pre;
                id+=now->cnt;
            }
            return;
        }
        id+=n;
        while (id>now->cnt){
            id-=now->cnt;
            now=now->nxt;
        }
    }
}p,xxx;

signed main(){
    p.now=&a;p.id=0;
    int Q;
    cin>>Q;
    while (Q--){
        string s;cin>>s;
        int t,x;
        //cout<<s<<"\n";
        switch(s[0]){
            case 'I':
                cin>>t;
                x=t;
                while (t--){
                    char x='\n';
                    while (x=='\n'||x=='\r')x=getchar();
                    int flag=p.now->insert(p.id+1,x);
                    if (flag){
                        p.now=p.now->nxt;p.id=1000;
                    }
                    else ++p.id;
                }
                p.move(-x);
                break;
            case 'M':
                cin>>t;
                p.now=&a;p.id=0;
                p.move(t);
                break;
            case 'D':
                cin>>t;
                while (t--){
                    while (p.id==p.now->cnt){
                        p.now=p.now->nxt;p.id=0;
                    }
                    p.now->del(p.id+1);
                }
                break;
            case 'G':
                cin>>t;
                xxx=p;
                while (t--){
                    while (p.id==p.now->cnt){
                        p.now=p.now->nxt;p.id=0;
                    }
                    ++p.id;
                    cout<<p.now->a[p.id];
                }
                cout<<"\n";
                p=xxx;
                break;
            case 'P':
                while (!p.id){
                    p.now=p.now->pre;p.id=p.now->cnt;
                }
                --p.id;
                break;
            case 'N':
                while (p.id==p.now->cnt){
                    p.now=p.now->nxt;p.id=0;
                }
                ++p.id;
                break;
        }
        //cout<<p.id<<"\n";
    }
    return 0;
}
2025/7/31 16:28
加载中...