ARC113 C-String Invasion (thinking, greedy)

Title:

Insert picture description here

solution:

容易发现:
当存在s[i]==s[i+1]且s[i]!=s[i+2],可以将i之后的所有字符全部变成s[i].

显然从后往前,遇到s[i]==s[i+1]且s[i]!=s[i+2]就操作一次.
设下标为[0,n-1],
那么在i位置进行操作对答案的贡献为(n-1)-i+1-mark[s[i]],其中mark[s[i]][i,n-1]中s[i]的数量.

注意操作完之后要修改mark数组.

code:

#include <bits/stdc++.h>
#define int long long
using namespace std;

signed main(){
    
    
    ios::sync_with_stdio(0);
    string s;cin>>s;
    int n=s.size();
    int ans=0;
    map<char,int>mark;
    for(int i=n-1;i>=0;i--){
    
    
        mark[s[i]]++;
        if(i>n-3)continue;
        if(s[i]==s[i+1]&&s[i]!=s[i+2]){
    
    
            ans+=(n-1)-i+1-mark[s[i]];
            mark.clear();
            mark[s[i]]=(n-1)-i+1;
        }
    }
    cout<<ans<<endl;
    return 0;
}

Guess you like

Origin blog.csdn.net/weixin_44178736/article/details/113927799