1 #include <bits / stdc ++。H> 2 using namespace std; 3 #define maxn 8005 4 int mp [30 ]; 5 int main(){ 6 int N、sum = 0、k、c = 0、i、j 、flag = 0、flag1 = 0 ; 7 文字列s; 8 cin >> N; 9 cin >> s; 10 memset(mp、0 、sizeof(mp)); 11 // 文字列が回文文字列になるかどうかを決定 12 for(int i = 0; i <N; i ++ ){ 13 mp [s [i]-'a'] ++ ; 14 } 15 for(int i = 0; i <24; i ++ ){ 16 if(mp [i]%2 == 1)flag1 ++ ; 17 if(flag1> 1) break ; 18 } 19 if(flag1> 1)printf( "不可能\ n " ); 20 else { 21 int temp = N-1 ; 22 for(i = 0; i <temp; i ++){ // フロントからバック 23 まで(j = temp; j> i; j- -){ // 24 を後ろから前に検索 if(s [i] == s [j]){ // 等しい文字に遭遇したときに適切な場所にスワップする必要がある 25 // jからiと対称に移動する場所(すなわち一時) 26 for(k = j; k <temp; k ++ ){ 27 s [k] = s [k + 1 ]; 28 } 29 s [temp] = s [i]; // これが以前のs [j] 、しかしs [j]はすでに他の文字で占められているので、その値と等しいs [i]は 30 sum + = temp-j; // 移動回数 31 temp--; // 境界を狭める 32 break ; 33 } 34 } 35 if(j == i){ // つまり、前の「前から後ろへ検索」は同じ文字を見つけることができず、それ自体だけを見つけて中央に移動し、 36 if(N %2 == 1 && c == 0 ){ 37 合計+ =(N / 2-私); 38 c == 1 ; 39 } 40 cout << "j:" << i << "i:" << temp << endl; 41 } 42 } 43 cout << sum << endl; 44 } 45 }