There is something in JavaScript: (the output is more or less immediate, and JavaScript is one of the slowest, I think):
<script> function f (s, m) { var i = 0, n = s.length, c = 0, H = {}, Hi = {} while (i < n-1) { for (var j=i+1; j<=Math.min (i + 1 + m,n - 1); j++) { if (s[i] == s[j]) { var i_= i, j_= j, tmp = '' while (s[i_] == s[j_] && i_ < j) { tmp += String (s[i_]) i_++ j_++ } var k = tmp.length - 1 while (k >= 0) { if (!H[tmp]) { H[tmp] = 1 Hi[tmp] = i c++ } else if (i == Hi[tmp]) { H[tmp]++ c++ } tmp = tmp.substr(0,k--) } } } i++ } var t1 = '' for (var i in H) t1 += i + ", " return [t1,c] } var a1 = [1,2,4,1,2,4,1,5,6,3,5], a2 = [] for (var i=0;i<100000;i++) a2.push(Math.floor(Math.random()*10)) console.log(a1 +"\n"+ f(a1,10)) console.log(f(a2,10)) </script>
Output:
1,2,4,1,2,4,1,5,6,3,5 1, 2, 4, 5, 12, 24, 41, 124, 241, ,10 ["0...6358, 3582, 038, 4304, 2068, 095, 9252, 37866, 3786, 7866, 7893, 8701, 0669, ", 771]