AEIOU

选出的子串中由AEI构成的子串和由OU构成的子串之间并没有什么关系,分别算出最长的加起来。

#pragma comment(linker, "/STACK:102400000,102400000")
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<vector>
#include<algorithm>
#include<iostream>
#include<map>
#include<queue>
#include<stack>
#include<string>
#include<functional>
#include<math.h>
//#include<bits/stdc++.h>
using namespace std;
typedef long long lint;
typedef vector<int> VI;
typedef pair<int, int> PII;
typedef queue<int> QI;


void makedata() {
    freopen("input.txt", "w", stdout);
    fclose(stdout);
}

string s;
int dp[1110000];
int p[256];

int main() {
#ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
#endif
    //makedata();
    std::ios::sync_with_stdio(0), cin.tie(0);
    cin >> s;
    int n = s.size();
    int max1 = 0, max2 = 0;
    memset(dp, 0, sizeof(dp));
    for (int i = 0; i < 256; i++) p[i] = -1;
    for (int i = 0; i < n; i++) {
        if (s[i] == 'a') {
            dp[i] = 1;
            if (p['a'] != -1) dp[i] = max(dp[i], dp[p['a']] + 1);
            if (dp[i] > dp[p['a']]) p['a'] = i;
        }
        if (s[i] == 'e') {
            dp[i] = 1;
            if (p['a'] != -1) dp[i] = max(dp[i], dp[p['a']] + 1);
            if (p['e'] != -1) dp[i] = max(dp[i], dp[p['e']] + 1);
            if (dp[i] > dp[p['e']]) p['e'] = i;
        }
        if (s[i] == 'i') {
            dp[i] = 1;
            if (p['a'] != -1) dp[i] = max(dp[i], dp[p['a']] + 1);
            if (p['e'] != -1) dp[i] = max(dp[i], dp[p['e']] + 1);
            if (p['i'] != -1) dp[i] = max(dp[i], dp[p['i']] + 1);
            if (dp[i] > dp[p['i']]) p['i'] = i;
        }
        max1 = max(max1, dp[i]);
    }
    memset(dp, 0, sizeof(dp));
    for (int i = 0; i < 256; i++) p[i] = -1;
    for (int i = 0; i < n; i++) {
        if (s[i] == 'o') {
            dp[i] = 1;
            if (p['o'] != -1) dp[i] = max(dp[i], dp[p['o']] + 1);
            if (dp[i] > dp[p['o']]) p['o'] = i;
        }
        if (s[i] == 'u') {
            dp[i] = 1;
            if (p['o'] != -1) dp[i] = max(dp[i], dp[p['o']] + 1);
            if (p['u'] != -1) dp[i] = max(dp[i], dp[p['u']] + 1);
            if (dp[i] > dp[p['u']]) p['u'] = i;
        }
        max2 = max(max2, dp[i]);
    }
    cout << max1 + max2 << endl;
    return 0;
}
View Code

相关文章: