1 条题解

  • 0
    @ 2023-12-7 17:07:33

    题面可以在这里看到: https://xgzc.github.io/Bzojch/JudgeOnline/2398.html

    不过需要注意的是要求求的是最长回文子序列,和manacher无关。请不要在意题目tag。

    lps就是串反转过来做lcs。lcs用带bitset优化的方法做。(参照hdu2253, loj6564)数据范围是5e4。然后就可以愉悦地通过此题。

    还有比较重要的一点就是,不一定要写平衡树,rope足以通过此题。至于reverse就拆成正反两个串做就好了。

    #include<bits/extc++.h>
    using namespace std;
    __gnu_cxx::crope R,$R,tmp;
    
    string s;
    
    #include <tr2/dynamic_bitset>
    using bits = tr2::dynamic_bitset<uint64_t>;
    
    constexpr void mius(const bits *g, const bits *d, const int n) {
        vector<uint64_t> &G = *(vector<uint64_t> *)g,
                         &D = *(vector<uint64_t> *)d;
        bool lst=0, lat=0; // last, latency
        for (int i = 0; i < n; ++i) {
            lat = G[i]<D[i]+lst;
            G[i] -= D[i]+lst;
            lst=lat;
        }
    }
    constexpr int maxn=5e4+3;
    bits S;
    bits p[28];
    int cnt[maxn];
    bool T[28];
    #define $(a) ((a)^96)
    
    int main() {
        while(cin>>s){
        int x,y,w; char z;
        const int T=R.size();
        if(s=="Insert"){
            cin>>x>>z;
            R.insert(x,z);
            $R.insert(T-x,z);
        }
        if(s=="Remove"){
            cin>>x;
            --x;
            R.erase(x,1);
            $R.erase(T-x-1,1);
        }
        if(s=="Modify"){
            cin>>x>>y>>z;
            --x;--y;
            tmp.clear();
            tmp.append(y-x+1,z);
            R.replace(x,y-x+1,tmp);
            $R.replace(T-y-1,y-x+1,tmp);
        }
        if(s=="Reverse"){
            cin>>x>>y;
            --x;--y;
            tmp=R.substr(x,y-x+1);
            R.replace(x,y-x+1,$R.mutable_begin()+T-y-1,
                    $R.mutable_begin()+T-x);
            $R.replace(T-y-1,y-x+1,tmp);
        }
        if(s=="Rotate"){
            cin>>x>>y>>w;
            --x;--y;
            w%=(y-x+1);
            R.insert(x,R.substr(y-w+1,w));
            R.erase(y+1,w);
            $R.insert(T-x,$R.substr(T-y-1,w));
            $R.erase(T-y-1,w);
        }
        }
        string a(R.begin(),R.end()), b($R.begin(),$R.end());
        const int $a=a.size(),$b=$a;
        // 怎么回事,lcs???
        // 还真是
        for(int i=0;i<28;++i){
            p[i].clear();
            p[i].resize($b);
        }
        for(int i=0;i<$b;++i){
            p[$(b[i])][i]=1;
            T[$(b[i])]=1;
        }
        S.clear();
        S.resize($b);
        if(T[$(a[0])])
            S[p[$(a[0])].find_first()]=1;
        bits t2, x($b);
        for(int i=1;i<$a;++i)
        if(T[$(a[i])]){
            x=S|p[$(a[i])];
            t2=x;
            S<<=1;
            S[0]=1;
            mius(&t2,&S,t2.num_blocks());
            S=(x^t2)&x;
        }
        cout<<S.count()<<'\n';
    }
    
    
    • 1

    信息

    ID
    2398
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    5
    已通过
    1
    上传者