• 宁波多校(三) H rabster的字符串世界(瞎搞题)


    可以不用建字典树

    其实字典树的新增节点大小就是排序后的字符串数组按序与前一个的最大后缀

    但是本题的每个字符不只一位并且卡了点内存,考虑建立结构体存储

    插入和删除可以维护一个set来找位置,算法比较简单,代码很蠢

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e5+10;
    int ans;
    struct node{
        short a[3001];
        short length;
        void init(){
            memset(this->a,-1,sizeof(this->a));
            length=0;
        }
        friend bool operator <(const node &x,const node &y){
            short len=max(x.length,y.length);
            for(short i=1;i<=len;i++){
                if(x.a[i]!=y.a[i])
                    return x.a[i]<y.a[i];
            }
            return false;
        }
        friend bool operator ==(const node &x,const node &y){
            if(x.length!=y.length)
                return false;
            for(short i=1;i<=x.length;i++){
                if(x.a[i]!=y.a[i])
                    return false;
            }
            return true;
        }
    }s[3001];
    struct cmp{
        bool operator()(short x,short y)
        {
            if(!(s[x]==s[y]))
                return s[x]<s[y];
            else
                return x<y;
        }
    };
    set<short,cmp> se;
    short cal(short i,short j){
        auto a=s[i];
        auto b=s[j];
        short cnt=0;
        for(short l=1,r=1;;l++,r++){
            if(l>a.length||r>b.length)
                break;
            if(a.a[l]!=b.a[r])
                break;
            if(a.a[l]==b.a[r])
                cnt++;
        }
        return cnt;
    }
    void earse(short pos){
        auto a=s[pos];
        auto tmp=se.find(pos);
        auto ed=se.end();
        ed--;
        if(tmp==se.begin()){
            ans-=a.length;
            auto b=++tmp;
            short scnt=cal(pos,*b);
            ans+=scnt;
        }
        else if(tmp==ed){
            ans-=a.length;
            auto b=--tmp;
            short scnt=cal(pos,*b);
            ans+=scnt;
        }
        else{
            auto x=tmp;
            auto c=--x;
            tmp++;
            short scnt=cal(pos,*c);
            short tcnt=cal(pos,*tmp);
            ans-=(s[pos].length-max(scnt,tcnt));
        }
        se.erase(pos);
    }
    void insert(short pos){
        auto a=s[pos];
        auto tmp=se.lower_bound(pos);
        auto ed=se.end();
        ed--;
        if(tmp==se.begin()){
            short tcnt=cal(pos,*tmp);
            ans+=a.length-tcnt;
        }
        else if(tmp==se.end()){
            tmp--;
            short tcnt=cal(pos,*tmp);
            ans+=a.length-tcnt;
        }
        else{
            auto tmp3=tmp;
            tmp3--;
            short tcnt=cal(pos,*tmp);
            short scnt=cal(pos,*tmp3);
            ans+=a.length-max(scnt,tcnt);
        }
        se.insert(pos);
    }
    int main(){
       // freopen("8.in","r",stdin);
        ios::sync_with_stdio(false);
        short n;
        cin>>n;
        short i;
        for(i=1;i<=n;i++){
            short l;
            cin>>l;
            for(short j=1;j<=l;j++){
                cin>>s[i].a[j];
            }
            s[i].length=l;
            se.insert(i);
        }
        ans=0;
        auto it=se.begin();
        auto it1=it;
        it++;
        ans+=s[*it1].length;
        for(;it!=se.end();it++){
            short scnt=cal(*it,*it1);
            ans+=s[*it].length-scnt;
            it1=it;
        }
        cout<<ans<<endl;
        short q;
        cin>>q;
        while(q--){
            short l;
            short pos;
            cin>>pos;
            earse(pos);
            cin>>l;
            s[pos].init();
            for(i=1;i<=l;i++){
                cin>>s[pos].a[i];
            }
            s[pos].length=l;
            insert(pos);
            cout<<ans<<endl;
        }
    }
    View Code
  • 相关阅读:
    intellij idea 修改web端口号
    intellij idea有时候有时候服务器报错500
    由于没有更新主分支的代码,总是报警
    intellij idea 快捷键
    intellij idea 修改文件名失败
    [Introduction to programming in Java 笔记] 1.3.8 Gambler's ruin simulation 赌徒破产模拟
    [Introduction to programming in Java 笔记] 1.3.7 Converting to binary 十进制到二进制的转换
    C++学习笔记-2-构造函数和析构函数
    python学习笔记--随时更新
    C++学习笔记-1-自增和自减运算符
  • 原文地址:https://www.cnblogs.com/ctyakwf/p/13271982.html
Copyright © 2020-2023  润新知