今天写了一下AC自动机的板子,然后TLE了一个点,就很迷
和之前写过的比较了一下发现一个定义的数组是
//AC
int trie[N][26]
一个是
//TLE
int trie[26][N]
因为AC自动机访问的时候是这个样子的
for(int i=0;i<26;i++)
if(tr[u][i])
q.push(tr[u][i]),fail[tr[u][i]]=tr[fail[u]][i];
这样的话把第一维放大的合适一点。
像ST表第一维放小的要合适一点。
int query(int l,int r){
int k=log2(r-l+1);
return max(Max[k][l],Max[k][r-(1<<k)+1]);
}
for(int j=1;j<=21;j++){
for(int i=1;i+(1<<j)-1<=n;i++){
Max[j][i]=max(Max[j-1][i],Max[j-1][i+((1<<j-1))]);
}
}
好吧我以后一定认真考虑缓存导致的常数问题。。。