Educational Codeforces Round 96 (Rated for Div. 2) D. String Deletion (思维)

-
题意:有一个\(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; }
𝓐𝓬𝓱𝓲𝓮𝓿𝓮𝓶𝓮𝓷𝓽 𝓹𝓻𝓸𝓿𝓲𝓭𝓮𝓼 𝓽𝓱𝓮 𝓸𝓷𝓵𝔂 𝓻𝓮𝓪𝓵
𝓹𝓵𝓮𝓪𝓼𝓾𝓻𝓮 𝓲𝓷 𝓵𝓲𝓯𝓮

浙公网安备 33010602011771号