1 solutions
-
0
Guest MOD
-
1
#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