template<typename T>

inline int levenshtein_distance(T* series1, T* series2, int count1, int count2)

{

    int count = count2 + 1;

    int* map = (int*)_alloca(sizeof(int) * count * 2);

    int* p0 = map;

    int* p1 = map + count;


    for(int y = 0; y < count; ++y) p0[y] = y;

    for(int y = 0; y < count1; ++y)

    {

        p1[0] = y + 1;

        T s = series1[y];

        for(int x = 0; x < count2; ++x)

        {

            int t[3];

            t[0] = p1[x] + 1;

            t[1] = p0[x + 1] + 1;

            t[2] = p0[x] + (s != series2[x]);

            p1[x + 1] = t[(t[1] < t[0]) * (t[1] < t[2]) + (t[2] < t[0]) * (t[2] <= t[1]) * 2];

        }

        int* t = p0;

        p0 = p1;

        p1 = t;

    }

    return p0[count2];

}


template<typename T>

int levenshtein_distance(T* series1, Tseries2)

{

    return levenshtein_distance(series1, series2, strlen(series1), strlen(series2));

}