题意:有一个\(01\)串,每次操作要先删除一个位置上的元素,然后删除相同前缀和,直到字符串被删完,问最多能操作多少次.
题解: 对于一个长度大于\(1\)的相同前缀,我们最多只能对它操作一次,然后就整个直接被删除了,所以它能提供的贡献就很少,我们记录所有连续的串的长度,然后我们最理想的删除条件是,最前面是单个的数(连续串长度为\(1\)),在它后面有长度大于\(1\)的连续相同串,我们每次删除一个连续相同串的一个字符,然后最前面的再删除一个,实验过程看代码吧.
代码:
int t;
int n;
string s;
vector<int> v;
int main() {
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>t;
while(t--){
cin>>n;
cin>>s;
v.clear();
int cnt=1;
for(int i=0;i<n-1;++i){
if(s[i]==s[i+1]) cnt++;
else{
v.pb(cnt);
cnt=1;
}
}
v.pb(cnt);
int pos=0;
int ans=0;
for(int i=0;i<(int)v.size();++i){
ans++;
pos=max(pos,i);
for(;pos<(int)v.size() && v[pos]<=1;++pos);
// 3 1 1 1
if(pos<(int)v.size() && v[pos]>=1){
v[pos]--;
}
else ++i;
}
cout<<ans<<endl;
}
return 0;
}
Educational Codeforces Round 96 (Rated for Div. 2) D. String Deletion (思维)
原文:https://www.cnblogs.com/lr599909928/p/13812527.html