1 条题解
-
0
题面可以在这里看到: 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
- 上传者