void getnext() { next[1] = n; int p = 1; while(p < n && t[p] == t[p + 1]) p++; next[2] = p-1; int k = 2,l; for(int i = 3; i <= n; i++) { p = k + next[k] - 1; l = next[i - k + 1]; if (i + l <= p) next[i] = l; else { int j = p - i + 1; if(j < 0) j = 0; while(i + j <= n && t[i + j] == t[j + 1]) j++; next[i] = j; k = i; } } }
void getextend() { int p = 0; while (p < m && p < n && s[p + 1] == t[p + 1]) { p++; } extend[1] = p; int k = 1, l; for (int i = 2; i <= m; i++) { p = k + extend[k] - 1; l = next[i - k + 1]; if (i + l <= p) { extend[i] = l; } else { int j = p - i + 1; if(j < 0) j = 0; while(i + j <= m && j + 1 <=n && s[i + j] == t[j + 1]) j ++; extend[i] = j; k = i; } } }