1 条题解
-
0
回文串(分段压缩)
每一对对称位置若字符不同,恰好改一个字符即可。维护左右段剩余长度,每次取两边剩余长度的较小值,并且不超过尚未处理的对称位置数;字符不同时增加这一批长度。消耗完的段指针向内推进。同一段内部的剩余位置都是同字符,无需再改。每段最多被消耗一次,O(n)时间、O(n)空间,答案和长度均用long long。
难度:3(geekpi-9-v2),依据:压缩字符串不能展开,需用双指针批量匹配对称段,并处理64位总长度。
#include <iostream> #include <vector> #include <string> #include <algorithm> using namespace std;int main(){int n;cin>>n;vector<long long>a(n);vector<char>c(n);long long len=0,ans=0;for(int i=0;i<n;i++){cin>>a[i]>>c[i];len+=a[i];}int l=0,r=n-1;long long left=len/2;while(l<r&&left){long long z=min({a[l],a[r],left});if(c[l]!=c[r])ans+=z;a[l]-=z;a[r]-=z;left-=z;if(!a[l])l++;if(!a[r])r--;}cout<<ans<<"\n";}本数据为GeekPi自建训练数据,非官方评测数据。
- 1