1 solutions

  • 1
    @ 2025-8-19 23:05:58
    #include <bits/stdc++.h>
    #define int long long
    #define endl '\n'
    using namespace std;
    const int N=1e6+10;
    char a[N];
    int n,cnt,ans=-1e18-7;
    bool check(int x){
    	if(x<0||x>(n-4)) return false;
    	if(a[x+0]!='p') return false;
    	if(a[x+1]!='i') return false;
    	if(a[x+2]!='g') return false;
    	if(a[x+3]!='g') return false;
    	if(a[x+4]!='y') return false;
    	return true;
    }
    signed main(){
    	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    	cin>>(a+1);
    	n=strlen(a+1); // 输入 
    	for(int i=1;i<=n-4;i++) if(check(i)) cnt++; //判断初始有多少个目标字符串,即 piggy 
    	if((cnt*5)==n){ // 特殊情况,即输入字符串是有连续个 piggy 构成的,而必须使用作弊器,所以需要将 cnt 减一 
    		cout<<(cnt-1)<<endl;
    		return 0;
    	}
    	for(int i=1;i<=n;i++){
    		char c=a[i]; // 暂存
    		int num=0; // 表示当前位置能对 cnt 起到的最大收益
    		
    		if(a[i]!='p'){ // 分类讨论每种情况,因为唯一有价值的更换,一定是改为 p i g y 中的一个 
    			int k=0;
    			a[i]='p';
    			if(check(i)) k++;
    			a[i]=c;
    			num=max(num,k);
    		}
    		
    		if(a[i]!='i'){
    			int k=0;
    			a[i]='i';
    			if(check(i-1)) k++;
    			a[i]=c;
    			num=max(num,k);
    		}
    		
    		if(a[i]!='g'){
    			int k=0;
    			a[i]='g';
    			if(check(i-2)) k++;
    			if(check(i-3)) k++; // 特殊情况,因为 piggy 中有两个 g,所以需要分类讨论这是第一个还是第二个 g 
    			a[i]=c;
    			num=max(num,k);
    		}
    		
    		if(a[i]!='y'){
    			int k=0;
    			a[i]='y';
    			if(check(i-4)) k++;
    			a[i]=c;
    			num=max(num,k);
    		}
    		
    		ans=max(ans,num); // 取最大值
    	}
    	cout<<cnt+ans<<endl; // 最终答案即为  原始个数cnt + 偏移量ans
    	return 0;
    }
    
    

    希望对大家有帮助,制作不易,点个赞吧

    Information

    ID
    1567
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    9
    Tags
    (None)
    # Submissions
    92
    Accepted
    10
    Uploaded By