func_code_string: #include <bits/stdc++.h>   using namespace std;   int count1[100005], count2[100005], count3[100005];   bool can_be_palin(int *a, int size) {     int i, no_of_odd = 0;     for (i = 0; i < size; i++) no_of_odd += a[i] % 2;     return (no_of_odd <= 1);   }   bool is_palin(int *a, int l, int r) {     for (int i = l; i <= (l + r) / 2; i++)       if (a[i] != a[r + l - i]) return false;     return true;   }   bool func(int *a, int n, int end, int l, int r) {     int i;     fill(count1, count1 + n + 1, 0);     fill(count2, count2 + n + 1, 0);     if (end - l + 1 >= r - end) {       for (i = l; i <= end; i++) count1[a[i]]++;       for (i = r; i > end; i--) count2[a[i]]++;       for (i = 1; i <= n; i++) {         if (count2[i] > count1[i]) return false;         count1[i] -= count2[i];       }       return can_be_palin(count1, n + 1);     } else {       for (i = l; i <= end; i++) count1[a[i]]++;       for (i = r; i >= r - end + l; i--) count2[a[i]]++;       for (i = 1; i <= n; i++) {         if (count2[i] > count1[i]) return false;         count1[i] -= count2[i];       }       return can_be_palin(count1, n + 1) && is_palin(a, end + 1, r - end + l - 1);     }   }   bool func2(int *a, int n, int end, int l, int r) {     int i;     fill(count1, count1 + n + 1, 0);     fill(count2, count2 + n + 1, 0);     if (r - end + 1 >= end - l) {       for (i = r; i >= end; i--) count1[a[i]]++;       for (i = l; i < end; i++) count2[a[i]]++;       for (i = 1; i <= n; i++) {         if (count2[i] > count1[i]) return false;         count1[i] -= count2[i];       }       return can_be_palin(count1, n + 1);     } else {       for (i = r; i >= end; i--) count1[a[i]]++;       for (i = l; i <= l + r - end; i++) count2[a[i]]++;       for (i = 1; i <= n; i++) {         if (count2[i] > count1[i]) return false;         count1[i] -= count2[i];       }       return can_be_palin(count1, n + 1) && is_palin(a, r - end + l + 1, end - 1);     }   }   int main() {     int n, i;     scanf( %d , &n);     long long ans = 0;     int a[n];     for (i = 0; i < n; i++) scanf( %d , &a[i]);     for (i = 0; i < n / 2 && a[i] == a[n - 1 - i]; i++)       ;     if (i == n / 2) {       printf( %I64d , (long long)n * (n + 1) / 2);       return 0;     }     int l = i, r = n - 1 - i, left_prev = l, right_prev = r, end = (l + r) / 2;     int prev_pos = -1;     while (left_prev < end - 1 && end < right_prev - 1) {       bool flag = true;       flag = func(a, n, end, l, r);       int mid1 = (end + left_prev) / 2;       int mid2 = (end + right_prev) / 2;       if (flag == false) {         left_prev = end;         end = mid2;       } else {         right_prev = end;         prev_pos = end;         end = mid1;       }     }     for (int k = left_prev; k < r && k < right_prev; k++)       if (func(a, n, k, l, r) == true)         prev_pos = (prev_pos == -1) ? k : min(prev_pos, k);     if (prev_pos != -1) ans += (long long)(l + 1) * (r - prev_pos);     right_prev = r, left_prev = l, end = (l + r) / 2;     prev_pos = -1;     while (end < right_prev - 1 && left_prev < end - 1) {       bool flag = true;       flag = func2(a, n, end, l, r);       int mid1 = (end + right_prev) / 2;       int mid2 = (end + left_prev) / 2;       if (flag == false) {         right_prev = end;         end = mid2;       } else {         left_prev = end;         prev_pos = end;         end = mid1;       }     }     for (int k = right_prev; k > l && k > left_prev; k--)       if (func2(a, n, k, l, r) == true)         prev_pos = (prev_pos == -1) ? k : max(prev_pos, k);     if (prev_pos != -1) ans += (long long)(n - r) * (prev_pos - l);     fill(count1, count1 + n + 1, 0);     for (i = l; i <= r; i++) count1[a[i]]++;     if (can_be_palin(count1, n + 1) == true) ans += (long long)(l + 1) * (n - r);     printf( %I64d , ans);   }   