kmp revisited