Advertisement
EmanueleBonin

palindromeIndex

Mar 16th, 2020
602
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.99 KB | None | 0 0
  1. #include <assert.h>
  2. #include <limits.h>
  3. #include <math.h>
  4. #include <stdbool.h>
  5. #include <stddef.h>
  6. #include <stdint.h>
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10.  
  11. char* readline();
  12.  
  13. // Complete the palindromeIndex function below.
  14. int palindromeIndex(char* s) {
  15.     int l=strlen(s), Eliminated=0, DelIdx=0, Found=0;
  16.  
  17.     for(int p=0; p<2 && Found==0; p++){
  18.         Eliminated = 0;
  19.         for(int i=0, j=l-1;i<l/2 && Eliminated < 2; i++, j--){
  20.             // confronto l'i-esimo con l'omologo carattere j-esimo
  21.             if (s[i] != s[j]){
  22.                 // sono diversi, quindi devo decidere quale eliminare
  23.                 if(p==0){
  24.                     if(s[i]==s[j-1]){
  25.                         // va eliminato j (prima passata)
  26.                         DelIdx = j;
  27.                         // ... ma i non deve cambiare al prossimo giro
  28.                         i--;
  29.                     } else {
  30.                         // va eliminato i (prima passata)
  31.                         DelIdx = i;
  32.                         // ma j non deve cambiare al prossimo giro
  33.                         j++;
  34.                     }
  35.                 } else {
  36.                     if(s[j]==s[i+1]){
  37.                         // va eliminato i (seconda passata)
  38.                         DelIdx = i;
  39.                         // ma j non deve cambiare al prossimo giro
  40.                         j++;
  41.                     } else {
  42.                         // va eliminato j (seconda passata)
  43.                         DelIdx = j;
  44.                         // ... ma i non deve cambiare al prossimo giro
  45.                         i--;
  46.                     }
  47.                 }
  48.                 Eliminated++;
  49.             }
  50.         }
  51.         Found = (Eliminated == 1? 1: 0);
  52.     }
  53.  
  54.     return (Eliminated != 1? -1: DelIdx);
  55. }
  56.  
  57.  
  58.  
  59. int main()
  60. {
  61.     FILE* fptr = fopen(getenv("OUTPUT_PATH"), "w");
  62.  
  63.     char* q_endptr;
  64.     char* q_str = readline();
  65.     int q = strtol(q_str, &q_endptr, 10);
  66.  
  67.     if (q_endptr == q_str || *q_endptr != '\0') { exit(EXIT_FAILURE); }
  68.  
  69.     for (int q_itr = 0; q_itr < q; q_itr++) {
  70.         char* s = readline();
  71.  
  72.         int result = palindromeIndex(s);
  73.  
  74.         fprintf(fptr, "%d\n", result);
  75.     }
  76.  
  77.     fclose(fptr);
  78.  
  79.     return 0;
  80. }
  81.  
  82. char* readline() {
  83.     size_t alloc_length = 1024;
  84.     size_t data_length = 0;
  85.     char* data = malloc(alloc_length);
  86.  
  87.     while (true) {
  88.         char* cursor = data + data_length;
  89.         char* line = fgets(cursor, alloc_length - data_length, stdin);
  90.  
  91.         if (!line) { break; }
  92.  
  93.         data_length += strlen(cursor);
  94.  
  95.         if (data_length < alloc_length - 1 || data[data_length - 1] == '\n') { break; }
  96.  
  97.         size_t new_length = alloc_length << 1;
  98.         data = realloc(data, new_length);
  99.  
  100.         if (!data) { break; }
  101.  
  102.         alloc_length = new_length;
  103.     }
  104.  
  105.     if (data[data_length - 1] == '\n') {
  106.         data[data_length - 1] = '\0';
  107.     }
  108.  
  109.     data = realloc(data, data_length);
  110.  
  111.     return data;
  112. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement