循环移位(后缀自动机)
题目描述: 题解: #include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=300010; char s[N]; int n,lst=1,tot=1; int len[N*2],ch[N*2][26],fa[N*2],pos[N*2]; //pos表示在原串中的位置 int sum[N][26]; ll ans; void add(int c){ int p=lst,np=lst=++tot; pos[np]=len[np]=len[p]+1; for(;p&&!ch[p][c];p=fa[p]) ch[p][c]=np; if(!p) fa[np]=1; else{ int q=ch[p][c]; if(len[q]==len[p]+1) fa[np]=q; else{ int nq=++tot; memcpy(ch[nq],ch[q],sizeof(ch[q])); fa[nq]=fa[q]; len[nq]=len[p]+1; pos[nq]=pos[q]; fa[q]=fa[np]=nq; for(;p&&ch[p][c]==q;p=fa[p]) ch[p][c]=nq; } } return; } int main(){ scanf("%s",s+1); n=strlen