Problem:
Score : 600 points

Problem Statement

We have N strings of lowercase English letters: S_1, S_2, \cdots, S_N.

Takahashi wants to make a string that is a palindrome by choosing one or more of these strings - the same string can be chosen more than once - and concatenating them in some order of his choice.

The cost of using the string S_i once is C_i, and the cost of using it multiple times is C_i multiplied by that number of times.

Find the minimum total cost needed to choose strings so that Takahashi can make a palindrome.

If there is no choice of strings in which he can make a palindrome, print -1.

Constraints

1 \leq N \leq 50

1 \leq |S_i| \leq 20

S_i consists of lowercase English letters.

1 \leq C_i \leq 10^9

Input

Input is given from Standard Input in the following format:

N
S_1 C_1
S_2 C_2
:
S_N C_N

Output

Print the minimum total cost needed to choose strings so that Takahashi can make a palindrome, or -1 if there is no such choice.

Sample Input 1

3
ba 3
abc 4
cbaa 5

Sample Output 1

7

We have ba, abc, and cbaa.

For example, we can use ba once and abc once for a cost of 7, then concatenate them in the order abc, ba to make a palindrome.
Also, we can use abc once and cbaa once for a cost of 9, then concatenate them in the order cbaa, abc to make a palindrome.

We cannot make a palindrome for a cost less than 7, so we should print 7.

Sample Input 2

2
abcab 5
cba 3

Sample Output 2

11

We can choose abcab once and cba twice, then concatenate them in the order abcab, cba, cba to make a palindrome for a cost of 11.

Sample Input 3

4
ab 5
cba 3
a 12
ab 10

Sample Output 3

8

We can choose a once, which is already a palindrome, but it is cheaper to concatenate ab and cba.

Sample Input 4

2
abc 1
ab 2

Sample Output 4

-1

We cannot make a palindrome, so we should print -1.

Solution in C++ (GCC 9.2.1) (judge verdict: Runtime Error)

#include <iostream>
#include <string>
#include <utility>

using namespace std;

void swap(int *xp, int *yp)
{
    int temp = *xp;
    *xp = *yp;
    *yp = temp;
}
void swap2(string *xp, string *yp)
{
    string temp = *xp;
    *xp = *yp;
    *yp = temp;
}

int palindrome(string string1){

    int i, length;
    int flag = 0;
    length = string1.size();
    for(i=0;i < length ;i++){
        if(string1[i] != string1[length-i-1]){
            flag = 1;
            break;
        }
    }

    if (flag) {
        return 0;
    }
    else {
        return 1;
    }

}

struct Pack {
    string s;
    int c;
};


int main() {

    int n,k=0;
    int res;
    cin>>n;
    auto *str = new string[n];
    int *cost = new int[n];
    Pack* arr;
    arr = new Pack[n];

    for(int i=0;i<n;i++){
        cin>>str[i];
        cin>>cost[i];
    }

    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            string temp;
            temp = str[i]+str[j];
            res = palindrome(temp);
            if(res==1){
                arr[k].s=temp;
                arr[k].c=cost[i]+cost[j];
                k++;
            }
        }
    }

    int min = arr[0].c;
    for(int i=0;i<k;i++){
        if(min>arr[i].c) {
            min=arr[i].c;
        }
    }

    if(res==1){
        cout<<min;
    }else{
        cout<<-1;
    }
    

   return 0;
}