标题被工藤新一拼死保护/泪目
枚举 i , 把所有的 \(a_{i-1}+a_j(j<i)\) 存入哈希表 , 只算 \(a_{i-1}\) 是因为只算了从 \(i-1\) 移到 \(i\) 的贡献
然后再枚举 \(p (p<i)\) 判断 \(a_i-a_p\) 的值是否在哈希表里
从两边往中间找
unsigned long long val(int l,int r){
return h[r]-h[l-1]*p[r-l+1];
}
int lstl=1,lstr=len;
for(int l=1,r=len;l<r;l++,r--){
if(val(lstl,l)==val(r,lstr)){
ans+=2,lstl=l+1,lstr=r-1;
}
}
到 i 的周期长度: \(i-p[i]\)
所以,如果 n%(n-p[n])==0 则有循环节
一个结论:
一个串 \((1-i)\) 前后缀相等的个数 = 从 \(i\) 开始跳 \(p\) 一直跳到 \(j=0\) 的跳的次数
所以可以记一个 cnt 数组 \(cnt[i+1]=cnt[j]+1\)