链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3985
BaoBao has just found a string
To make this string more valuable, BaoBao decides to buy some characters from a character store. Each time he can buy one 'C' or one 'P' from the store, and insert the character into any position in
The final value BaoBao obtains is the final value of
Input
There are multiple test cases. The first line of the input contains an integer
The first line contains an integer
The second line contains the string
It's guaranteed that the sum of
Output
For each test case output one line containing one integer, indicating the maximum final value BaoBao can obtain.
Sample Input
3
3
CCC
5
CCCCP
4
CPCP
Sample Output
1
1
1
Hint
For the first sample test case, BaoBao can buy one 'P' (cost 0 value) and change
For the second sample test case, BaoBao can buy one 'C' and one 'P' (cost 0 + 1 = 1 value) and change
For the third sample test case, BaoBao can buy one 'C' (cost 0 value) and change
It's easy to prove that no strategies of buying and inserting characters can achieve a better result for the sample test cases.
题意:
在一个字符串中可以多次添加C,P,每i次添加需要减去价值(i-1),求最大的价值
分析:
暴力,一个for循环,很简单,但是前后缀和我给弄混了,wrong了8发
代码:
#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=200010;
int n,m,k;
int a[maxn],sumq[maxn],sumh[maxn];
int c[maxn];
int ans,ct,cnt,tmp,flag;
char s[maxn];
int main()
{
int T,cas=1;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
ans=0; flag=1;
scanf("%s",s);
int l=strlen(s);
sumq[0]=0;
sumh[l]=0;
for(int i=0;i<l;i++){
if(i) sumq[i]=sumq[i-1];
if(i-3>=0&&s[i-3]=='C'&&s[i-2]=='C'&&s[i-1]=='P'&&s[i]=='C')
{
sumq[i]++;
}
}
for(int i=l-1;i>=0;i--)
{
sumh[i]=sumh[i+1];
if(i+3>=l)continue;
if(s[i]=='C'&&s[i+1]=='C'&&s[i+2]=='P'&&s[i+3]=='C')
{
sumh[i]++;
}
}
ans=max(sumq[l-1],sumh[0]);
for(int i=0;i<l;i++)
{
if(s[i]=='C'&&s[i+1]=='P'&&s[i+2]=='C'&&i+2<l)
{
if(i==0) ans=max(ans,sumh[i]+1);
else ans=max(ans,sumq[i-1]+sumh[i]+1);
continue;
}
if(s[i-2]=='C'&&s[i-1]=='C'&&s[i]=='C'&&i>=2)
{
if(i==2) ans=max(ans,sumh[i]+1);
else ans=max(ans,sumq[i-1]+sumh[i]+1);
continue;
}
if(s[i-1]=='C'&&s[i]=='P'&&s[i+1]=='C'&&i+1<l&&i-1>=0)
{
if(i==0) ans=max(ans,sumh[i]+1);
else ans=max(ans,sumq[i-1]+sumh[i]+1);
continue;
}
if(s[i-2]=='C'&&s[i-1]=='C'&&s[i]=='P'&&i>=2)
{
if(i==2) ans=max(ans,sumh[i]+1);
else
ans=max(ans,sumq[i]+sumh[i+1]+1);
continue;
}
}
printf("%d\n",ans);
}
return 0;
}