Language: C++

#include <iostream>
#include <cstdio>
#include<list>
#include<iomanip>
#include<cmath>
#include<queue>
#include <functional>
#include<stdio.h>
#include<assert.h>
#include<stack>
#include<sstream>
#include <cstdlib>
#include<map>
#include<algorithm>
#include<iostream>
#include<set>
#include<utility>
#include<memory.h>
#include<string>
#include<vector>
#include<numeric>
#include <unordered_map>
using namespace std;
#define ll  long long
#define pb push_back
#define fi(ss) freopen (ss,"r",stdin)
#define fo(ss) freopen (ss,"w",stdout)
#define sz(v)               ((int)((v).size()))
#define all(x)          (x).begin(),(x).end()
#define REP(i, v)       for(int i=0;i<sz(v);i++)
typedef pair<int,int> pii;
#define ios std::ios_base::sync_with_stdio(false);
using namespace std;
//import java.io.BufferedReader;
//import java.io.IOException;
//import java.io.InputStream;
//import java.io.InputStreamReader;
//import java.io.PrintWriter;
//import java.util.Arrays;
//import java.util.LinkedList;
//import java.util.Queue;
//import java.util.StringTokenizer;
//import java.util.TreeMap;
//import java.util.TreeSet;
//
//public class GridCut
//{
//
//	static int bit[] = new int[1 << 19];
//	static int lim;
//
//	static int query(int ind)
//	{
//		ind++;
//		int s = 0;
//		while(ind > 0)
//		{
//			s += bit[ind];
//			ind -= ind & - ind;
//		}
//		return s;
//	}
//	static void upd(int r)
//	{
//		add(0,1);
//		add(r + 1,-1);
//	}
//
//	static void add(int ind,int delta)
//	{
//		ind++;
//		while(ind < lim)
//		{
//			bit[ind] += delta;
//			ind += ind & - ind;
//		}
//	}
//
//	public static void main(String[]args)throws Throwable
//	{
//
//		Scanner sc = new Scanner(System.in);
//		int t = 1;
//		PrintWriter out = new PrintWriter(System.out);
//		int tc = 1;
//		Queue<Integer> q[] = new LinkedList[26];
//		for(int i = 0 ; i < 26 ; ++i) q[i] = new LinkedList();
//		String a,b;
//		boolean g[][];
//		while(t-- > 0)
//		{
//			for(int i = 0 ; i < 26 ; ++i) q[i] = new LinkedList();
//			g = new boolean[26][26];
//			a = sc.next();
//			b = "";
//			StringBuilder sb = new StringBuilder();
//			for(int i = a.length() - 1;  i >= 0 ; --i) sb.append(a.charAt(i));
//			b = sb.toString();
//			int k = sc.nextInt();
//			for(int i = 0 ; i < 26 ; ++i) {
//				for(int j = 0 ; j < 26 ; ++j)
//					g[i][j] = true;
//			}
//			if(a.length() != b.length())
//			{
//				out.println("-1");
//				continue;
//			}
//			long mod = 1L << 32;
//			int n = a.length();
//			// solve
//			for(int i = 0 ; i < n ; ++i)
//			{
//				q[a.charAt(i) - 'a'].add(i);
//				bit[i] = 0;
//			}
//			bit[n + 1] =   bit[n] = 0;
//			long steps = 0;
//			lim = n + 1;
//			for(int i = 0 ; i < n ; ++i)
//			{
//
//				char nxt = b.charAt(i);
//				if(q[nxt -'a'].isEmpty())
//				{
//					steps = -1;
//					break;
//				}
//				int curr = q[nxt - 'a'].poll();
//				for(int j = 0 ; j < 26 ; ++j)
//				{
//					if(steps == -1)
//						break;
//					char here = (char)(j + 'a');
//					if(!q[j].isEmpty())
//					{
//						if(q[j].peek() <= curr && !g[nxt - 'a'][here - 'a'])
//							steps = -1;
//					}
//				}
//				if(steps == -1)
//					break;
//				steps += curr - i + query(curr)%mod;
//				while(steps < 0) steps += mod;
//				steps %= mod;
//				upd(curr);
//
//
//			}
//
//
//			out.println(steps);
//
//		}
//		out.flush();
//		out.close();
//
//	}
//
//	static class Scanner
//	{
//		BufferedReader br;
//		StringTokenizer st;
//
//
//		Scanner(InputStream s)  { br = new BufferedReader(new InputStreamReader(s)); }
//
//		String next() throws IOException
//		{
//
//			while(st == null || !st.hasMoreTokens())
//				st = new StringTokenizer(br.readLine());
//			return st.nextToken();
//
//		}
//		int nextInt() throws NumberFormatException, IOException { return Integer.parseInt(next()); }
//
//
//
//	}
//}

#define maxn 1000010
char s[maxn];
int prefix[maxn];
int a[maxn],coef[maxn];
int gg[maxn];
int c[26],pos[26];
int n;
ll ans;

void add(int p)
{
	for (;p<=n;p+=(p&(p^(p-1)))) gg[p]++;
}

int ask(int p){
	int res=0;
	for (;p>0;p-=(p&(p^(p-1)))) res+=gg[p];
	return res;
}

int solve()
{

	memset(c,0,sizeof(c));

	memset(pos,-1,sizeof(pos));

	for (i=0;i<n;i++)
	{
		coef[i]=0;

		a[i]=s[i]-'A';

		c[a[i]]++;

		if (pos[a[i]]>-1)
		{
			prefix[i]=pos[a[i]];

		}else
		{
			prefix[i]=-1;
			pos[a[i]]=i;
		}
	}
	for (i=k=0;i<26;i++)
	{
		if ( ( c[i]&1 ) > 0 )
		{
			if (k || (n&1)==0) {
				return 0;

			}
			k=1;
		}
	}
	ans = 0;
	for (i = tp = 0 ; i < n ; i++)
		if (!coef[i])
		{
			if (i==pos[a[i]])
			{
				ans+=(n>>1)-tp;
				continue;
			}
			tp++;
			k=pos[a[i]];
			pos[a[i]]=prefix[pos[a[i]]];
			ans+=(n-k-1)-ask(n-k-1);
			add(n-k);
			coef[k]=coef[i]=1;
		}
	return 1;
}

int main(){
	scanf("%s",s);
	n = strlen(s);
	if (solve()) {
		cout << ans << "\n";
	}
	else cout << "-1\n";
	return 0;
}


Compiler output:
a.cc: In function 'int solve()':
a.cc:210:14: error: 'i' was not declared in this scope
  210 |         for (i=0;i<n;i++)
      |              ^
a.cc:228:14: error: 'i' was not declared in this scope
  228 |         for (i=k=0;i<26;i++)
      |              ^
a.cc:228:16: error: 'k' was not declared in this scope
  228 |         for (i=k=0;i<26;i++)
      |                ^
a.cc:240:14: error: 'i' was not declared in this scope
  240 |         for (i = tp = 0 ; i < n ; i++)
      |              ^
a.cc:240:18: error: 'tp' was not declared in this scope; did you mean 'tm'?
  240 |         for (i = tp = 0 ; i < n ; i++)
      |                  ^~
      |                  tm
a.cc:249:25: error: 'k' was not declared in this scope
  249 |                         k=pos[a[i]];
      |                         ^