求出每个位置从每个位置开始 和 从串的初始开始最多能匹配多少长。
代码:
#include<bits/stdc++.h> using namespace std; const int N=1e6+10; int n, z[N]; char s[N]; void init(){ z[0] = n; int j = 1, k; for(int i = 1; i < n; i = k){ if(j < i) j = i; while(j < n && S[j] == S[j-i]) j++; z[i] = j-i; k = i+1; while(k + z[k-i] < j) z[k]=z[k-i],k++; } } int main(){ scanf("%s", s); n = strlen(S); init(); return 0; }