AEIOU

时间限制: 10000ms
单点时限: 1000ms
内存限制: 256MB

描述

给定一个只包含aeiou的字符串S,请你找到其中的最长的子序列,满足:

1. 所有的a都在e和i之前,所有的e都在i之前;

2. 所有的o都在u之前。  

输出最长满足条件的子序列的长度。  

例如对于S = aeiouaeiou,满足条件的最长的子序列有 aoaeiou, aeiouiu等。长度都是7。

输入

输入只有一行,字符串S。  

对于50%的数据,1 ≤= |S| ≤ 1000  

对于100%的数据,1 ≤= |S| ≤ 1000000

输出

一个整数,表示答案。

样例输入
aeiouaeiou
样例输出
7

思路:此处的'只包含aeiou'是说包含aeiou的子序列,注意到a、e、i与o、u无关,所以字符串S的最长子序列为a、e、i构成的串最长子序列与o、u构成的串最长子序列之和

#include <iostream>

using namespace std;

const int maxn = 1e6+5;

int main(){
//	freopen("Data.txt","r",stdin);
	ios::sync_with_stdio(false);
	cin.tie(0);
	char s[maxn];
	int dp[maxn] = {0};
	int i;
	cin >> s;
	for(i=0;s[i];i++){
		if(s[i] == 'a') dp[0] ++;
		else if(s[i] == 'e') dp[1] = max(dp[0],dp[1])+1;
		else if(s[i] == 'i') dp[2] = max(max(dp[0],dp[1]),dp[2])+1;
		else if(s[i] == 'o') dp[3] ++;
		else dp[4] = max(dp[3],dp[4])+1; 
	}
	cout << dp[2]+dp[4] << '\n';
	return 0;
}
参照[1]: http://hihocoder.com/contest/offers46/solution/1265666



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值