RT,这道题如果用暴力跳fail指针的方法是肯定会被卡掉的
然而蒟蒻的我用了一个粗暴的路径压缩,如这样:
for(int i = 0; i < 26; i++) {
int v = t[u][i];
if(v) {
fail[v] = t[fail[u]][i];
lst[v] = end[fail[v]]?fail[v]:lst[fail[v]];
q.push(v);
} else t[u][i] = t[fail[u]][i];
}
然后跳的时候直接这样:
for(int t = u; t; t = lst[t]) ans[end[t]]++;
居然直接过了这道题,在其他AC自动机的题居然有的比用fail树的方法更快
请问各位这个容易被卡吗?能证明复杂度吗?
附上评测记录:
评测记录