1. 程式人生 > >ZOJ-3985 String of CCPC(字串處理)

ZOJ-3985 String of CCPC(字串處理)

傳送門:

題意:

給你一個字串,其中只有'C',‘P’兩種字元。現在你可以從商店中購買‘C’,'P'兩種字元,但需要支付費用,第一次購買需要支付0,第二次支付1,第n次支付n-1。現在你可以通過組成CCPC字元來賺取1,每組成一個CCPC字元賺1。其中CCPCCPC這是兩個CCPC。問你最多賺多少錢。

思路:

其實就是要麼不購買,要麼就購買一次。因為購買兩次及以上就只能賠錢。

一共會有三種情況

1.CCC型,這時需要購買一個P,插入到第二個C後。但是還需判斷是不是CCCPC型別,如果是這種情況,那麼就不需購買P了。

2.CPC型,這時需要買一個C,插入到第一個C後。但是需要判斷第一個C的前一位是不是C,如果是C,那麼就不購買。

3.CCP型,這時需要買一個C,插入到P後面,需要判斷P後面是不是C,如果是,就不買。

從頭遍歷一遍就行。

程式碼:

#include<cstdio>
#include<iostream>
#include<cstring> 
#include<algorithm>
using namespace std;
char ch[200005];
bool book[200005];
int n;
bool ccc(int i)
{
	if(i + 2 >= n)
		return false;
	if(i + 4 < n && ch[i+3] == 'P' && ch[i+4] == 'C')
		return false;	
	if(ch[i] == 'C' && ch[i+1] == 'C' && ch[i+2] == 'C')
		return true;	
	return false;	
}
bool cpc(int i)
{
	if(i+2 >= n)
		return false;
	if(i-1 >= 0 && ch[i-1] == 'C')
		return false;
	if(ch[i] == 'C' && ch[i+1] == 'P' && ch[i+2] == 'C')
		return true;
	return false;			
}
bool ccp(int i)
{
	if(i+2 >= n)
		return false;
	if(i+3 < n && ch[i+3] == 'C')
		return false;
	if(ch[i] == 'C' && ch[i+1] == 'C' && ch[i+2] =='P')	
		return true;
	return false;		
}
bool ccpc(int i)
{
	if(i+3 >= n)
		return false;
	if(ch[i] == 'C' && ch[i+1] == 'C' && ch[i+2] == 'P' && ch[i+3] == 'C')
		return true;
	return false;		
}
int main()
{
	int t;
	cin >> t;
	while(t--) {

		
		scanf("%d%s", &n,ch);
		int ans = 0; 
		memset(book,1,sizeof(book));
		int flag = 0;
		for(int i = 0; i < n; i++) {
			if(ccc(i) || cpc(i) || ccp(i)) {
				flag = 1;
			}
			if(ccpc(i))
				ans++;	
		}
		
		printf("%d\n", ans+flag); 
		
	}
	
	return 0;
}