#include <cstdio>
#include <cinttypes>
int inputstr[200000];
int64_t hash(int64_t n){
return ((n+1)*n)/2;
}
int find_end_of_easy_word(int first_index,int limit){
if(first_index+2>=limit){
if(inputstr[limit-1]==inputstr[limit-2])
return limit;//if two last characters create easy word, return limit outside the word (effectively including last char also)
return limit-1;
}
int i;
for(i=first_index+2;i<limit;i++){
if(inputstr[i-2]==inputstr[i-1]&&inputstr[i-1]==inputstr[i])
break;
}
return i;
}
int find_begin_of_next_easy_word(int first_index,int limit){
//first index must point part of hard word (the safest is to pass first letter of hard word)
while(first_index+1<limit&&inputstr[first_index]==inputstr[first_index+1]){
first_index++;
}
return first_index-1;
}
int main(){
int nchrs=0;
char chr=0;
while(1){
if(scanf("%c",&chr)!=1)
break;
if(chr>'z'||chr<'a')
break;
if(chr=='a'||chr=='e'||chr=='i'||chr=='o'||chr=='u'||chr=='y')
chr=0;
else
chr=1;
inputstr[nchrs++]=chr;
}
//for(int i=0;i<nchrs;i++)
// printf("%d",inputstr[i]);
//printf("\n");
if(nchrs<=2){
printf("0\n");
return 0;
}
int64_t easy_quantity=0;
int pos=0;
while(1){
//printf("start search at %d\n",pos);
int end_of_easy=find_end_of_easy_word(pos,nchrs);
//printf("found easy at pos %d, len %d (end@%d)\n",pos,end_of_easy-pos,end_of_easy);
easy_quantity+=hash(end_of_easy-pos);
if(end_of_easy>=nchrs)
break;
int next_easy=find_begin_of_next_easy_word(end_of_easy-1,nchrs);
//printf("next easy starts at %d\n",next_easy);
int spacing_len=next_easy-end_of_easy;
//printf("spacing len=%d (correction %d)\n",spacing_len,spacing_len*2+1);
easy_quantity+=spacing_len*2+1;
pos=next_easy;
}
printf("%" PRId64 "\n",hash(nchrs)-easy_quantity);
//printf("%d-%d",hash(nchrs),easy_quantity);
return 0;
}
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 | #include <cstdio> #include <cinttypes> int inputstr[200000]; int64_t hash(int64_t n){ return ((n+1)*n)/2; } int find_end_of_easy_word(int first_index,int limit){ if(first_index+2>=limit){ if(inputstr[limit-1]==inputstr[limit-2]) return limit;//if two last characters create easy word, return limit outside the word (effectively including last char also) return limit-1; } int i; for(i=first_index+2;i<limit;i++){ if(inputstr[i-2]==inputstr[i-1]&&inputstr[i-1]==inputstr[i]) break; } return i; } int find_begin_of_next_easy_word(int first_index,int limit){ //first index must point part of hard word (the safest is to pass first letter of hard word) while(first_index+1<limit&&inputstr[first_index]==inputstr[first_index+1]){ first_index++; } return first_index-1; } int main(){ int nchrs=0; char chr=0; while(1){ if(scanf("%c",&chr)!=1) break; if(chr>'z'||chr<'a') break; if(chr=='a'||chr=='e'||chr=='i'||chr=='o'||chr=='u'||chr=='y') chr=0; else chr=1; inputstr[nchrs++]=chr; } //for(int i=0;i<nchrs;i++) // printf("%d",inputstr[i]); //printf("\n"); if(nchrs<=2){ printf("0\n"); return 0; } int64_t easy_quantity=0; int pos=0; while(1){ //printf("start search at %d\n",pos); int end_of_easy=find_end_of_easy_word(pos,nchrs); //printf("found easy at pos %d, len %d (end@%d)\n",pos,end_of_easy-pos,end_of_easy); easy_quantity+=hash(end_of_easy-pos); if(end_of_easy>=nchrs) break; int next_easy=find_begin_of_next_easy_word(end_of_easy-1,nchrs); //printf("next easy starts at %d\n",next_easy); int spacing_len=next_easy-end_of_easy; //printf("spacing len=%d (correction %d)\n",spacing_len,spacing_len*2+1); easy_quantity+=spacing_len*2+1; pos=next_easy; } printf("%" PRId64 "\n",hash(nchrs)-easy_quantity); //printf("%d-%d",hash(nchrs),easy_quantity); return 0; } |
English