[ create a new paste ] login | about

Link: http://codepad.org/MQLj0ydB    [ raw code | fork ]

D, pasted on Nov 29:
import d.time: clock;
import d.xio: xfile;
import std.string: stripr, toString;

int count(string s) {
    int result;
    int n = s.length;
    s ~= " ";
    auto a = new int[][](128, 0);

    for (int i = n - 1; i > -1; i--) {
        int lev;
        for (int st = a[s[i]].length - 1; st > -1; st--) {
            int j = a[s[i]][st];
            if (n - j <= lev)
                break;
            if (s[j + lev] != s[i + lev])
                continue;
            if (s[j + lev / 2] != s[i + lev / 2])
                continue;
            int k;
            while (s[j + k] == s[i + k])
                k++;
            if (k > lev)
                lev = k;
        }
        a[s[i]] ~= i;
        result += n - i - lev;
    }
    return result;
}

void main() {
    auto t0 = clock();
    auto fin = xfile("input.txt");
    auto fout = xfile("output.txt", "w");
    fin.readline();
    foreach (line; fin)
        fout.write(toString(count(line.stripr())) ~ \n);
    fout.write(toString(clock() - t0) ~ \n);
    fout.close();
}


Create a new paste based on this one


Comments: