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; }