Z racji, że OI się już skończyło to można by się już podzielić swoimi rozwiązaniami :) (nikt już pocztą też raczej nie wyśle, chyba, że ma lewe układy z Panią Z Okienka i mu wbije wczorajszą datę :P Może ja się pochwalę jedynym, na które miałem pomysł (zrobione w 2 dni bo miałem kompa w serwisie [sic!] i na więcej nie starczyło czasu), a mianowicie Litery:
/**
* @file lit.cpp
*
* @date 12-11-2011
* @author Łukasz Niemier
*/
#include <cstdio>
#include <list>
#include <vector>
#define ord(c) ((c) - 'A')
const unsigned int DICT_SIZE = 'Z' - 'A' + 1;
const unsigned int MAX_SIZE = 1000002;
char jas[MAX_SIZE];
char malgosia[MAX_SIZE];
unsigned int strLen, i;
unsigned long long int swaps;
std::list<int> Q[DICT_SIZE];
std::vector<int> positions;
void gen_positions() {
for (i = 0; i < strLen; i++)
Q[ord(malgosia[i])].push_back(i);
for (i = 0; i < strLen; i++) {
positions[i] = Q[ord(jas[i])].front();
Q[ord(jas[i])].pop_front();
}
}
int merge(std::vector<int>& arr, std::vector<int>& temp, int left, int mid,
int right) {
int i, j, k;
i = left; //< left subarray index
j = mid; //< right subarray index
k = left; //< merged subarray index
while ((i <= mid - 1) && (j <= right)) {
if (arr[i] <= arr[j]) {
temp[k++] = arr[i++];
} else {
temp[k++] = arr[j++];
swaps = swaps + (mid - i);
}
}
while (i <= mid - 1)
temp[k++] = arr[i++];
while (j <= right)
temp[k++] = arr[j++];
for (i = left; i <= right; i++)
arr[i] = temp[i];
return swaps;
}
int merge_sort(std::vector<int>& arr, std::vector<int>& temp, int left,
int right) {
int mid;
if (right > left) {
mid = (right + left) / 2; //< divide array to two parts
merge_sort(arr, temp, left, mid);
merge_sort(arr, temp, mid + 1, right);
merge(arr, temp, left, mid + 1, right);
}
return swaps;
}
int inv_count(std::vector<int>& arr) {
std::vector<int> temp(arr.size());
return merge_sort(arr, temp, 0, arr.size() - 1);
}
int main(int argc, char **argv) {
scanf("%u", &strLen);
scanf("%s", jas);
scanf("%s", malgosia);
positions.resize(strLen);
gen_positions();
inv_count(positions);
printf("%llu", swaps);
return 0;
}
Zrobione częściowo na wektorach bo z nimi było mniej babrania się.