#include <iostream> #include <ctype.h> using namespace std; bool isVowel(char c){ c = tolower(c); string vowels = "aeiouy"; for(char letter : vowels) if(c == letter) return true; return false; } const int MAX_N = 200005; int word[MAX_N]; int wordSeq[MAX_N]; int leftSeq[MAX_N]; int rightSeq[MAX_N]; int main(){ ios_base::sync_with_stdio(0); cin.tie(); string s; cin>>s; int n = s.length(); //convert to bits for(int i=0; i<n; ++i) word[i] = isVowel(s[i]); //find seq int seq = 1; int prev = word[0]; for(int i=1; i<n; ++i){ if(prev == word[i]){ ++seq; if(seq == 3){ wordSeq[i-1] = 1; wordSeq[i-2] = 1; } if(seq >= 3){ wordSeq[i] = 1; } } else{ seq = 1; } prev = word[i]; } //count seq from left int counter = wordSeq[0]; for(int i=1; i<n; ++i){ if(wordSeq[i]){ ++counter; leftSeq[i] = leftSeq[i-1] + 1; } else{ if(counter >= 3){ leftSeq[i-2] = leftSeq[i-3]; leftSeq[i-1] = leftSeq[i-2]; } leftSeq[i] = leftSeq[i-1]; counter = 0; } } //count seq from right counter = wordSeq[n-1]; for(int i=n-2; i>=0; --i){ if(wordSeq[i]){ ++counter; rightSeq[i] = rightSeq[i+1] + 1; } else{ if(counter >= 3){ rightSeq[i+2] = rightSeq[i+3]; rightSeq[i+1] = rightSeq[i+2]; } rightSeq[i] = rightSeq[i+1]; counter = 0; } } long long int result = 0; //calculate result prev = 0; for(int i=0; i<n; ++i){ if(leftSeq[i] != prev){ int res = (i+1) * (n-i-2); res -= (i+1) * rightSeq[i+3]; res -= leftSeq[i-1] * (n-i-2); res += rightSeq[i+3] * leftSeq[i-1]; //cout << i << "->" << (i+1) * (n-i-2) << " " << i * rightSeq[i+3] << " " << leftSeq[i-1] * (n-1) << " " << rightSeq[i+3] * leftSeq[i-1] << endl; result += res; } prev = leftSeq[i]; } /* for(int i=0; i<n; ++i){ cout<<leftSeq[i]<<" "; } cout<<endl; for(int i=0; i<n; ++i){ cout<<rightSeq[i]<<" "; } //*/ cout<<result<<endl; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 | #include <iostream> #include <ctype.h> using namespace std; bool isVowel(char c){ c = tolower(c); string vowels = "aeiouy"; for(char letter : vowels) if(c == letter) return true; return false; } const int MAX_N = 200005; int word[MAX_N]; int wordSeq[MAX_N]; int leftSeq[MAX_N]; int rightSeq[MAX_N]; int main(){ ios_base::sync_with_stdio(0); cin.tie(); string s; cin>>s; int n = s.length(); //convert to bits for(int i=0; i<n; ++i) word[i] = isVowel(s[i]); //find seq int seq = 1; int prev = word[0]; for(int i=1; i<n; ++i){ if(prev == word[i]){ ++seq; if(seq == 3){ wordSeq[i-1] = 1; wordSeq[i-2] = 1; } if(seq >= 3){ wordSeq[i] = 1; } } else{ seq = 1; } prev = word[i]; } //count seq from left int counter = wordSeq[0]; for(int i=1; i<n; ++i){ if(wordSeq[i]){ ++counter; leftSeq[i] = leftSeq[i-1] + 1; } else{ if(counter >= 3){ leftSeq[i-2] = leftSeq[i-3]; leftSeq[i-1] = leftSeq[i-2]; } leftSeq[i] = leftSeq[i-1]; counter = 0; } } //count seq from right counter = wordSeq[n-1]; for(int i=n-2; i>=0; --i){ if(wordSeq[i]){ ++counter; rightSeq[i] = rightSeq[i+1] + 1; } else{ if(counter >= 3){ rightSeq[i+2] = rightSeq[i+3]; rightSeq[i+1] = rightSeq[i+2]; } rightSeq[i] = rightSeq[i+1]; counter = 0; } } long long int result = 0; //calculate result prev = 0; for(int i=0; i<n; ++i){ if(leftSeq[i] != prev){ int res = (i+1) * (n-i-2); res -= (i+1) * rightSeq[i+3]; res -= leftSeq[i-1] * (n-i-2); res += rightSeq[i+3] * leftSeq[i-1]; //cout << i << "->" << (i+1) * (n-i-2) << " " << i * rightSeq[i+3] << " " << leftSeq[i-1] * (n-1) << " " << rightSeq[i+3] * leftSeq[i-1] << endl; result += res; } prev = leftSeq[i]; } /* for(int i=0; i<n; ++i){ cout<<leftSeq[i]<<" "; } cout<<endl; for(int i=0; i<n; ++i){ cout<<rightSeq[i]<<" "; } //*/ cout<<result<<endl; } |