时间限制:
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