裸的SA?
SA求出来然后单调栈+height搞一搞就好了啊qwq
话说,为什么我这玩意自闭了啊
吸氧就能过 不吸就挂QAQ
好像是longlong强转出问题了emm
不管了我自闭了。
#include#include #include #include #define inf 20021225#define ll long long#define mxn 500010using namespace std;int sa[mxn],ht[mxn],rk[mxn],tp[mxn],pre[mxn],n,m;char ch[mxn];void sort(){ for(int i=1;i<=m;i++) pre[i]=0; for(int i=1;i<=n;i++) pre[rk[i]]++; for(int i=1;i<=m;i++) pre[i]+=pre[i-1]; for(int i=n;i;i--) sa[pre[rk[tp[i]]]--]=tp[i];}int id(char c){return c-'a'+1;}void getSA(){ m=26; for(int i=1;i<=n;i++) pre[rk[i]=id(ch[i])]++; for(int i=1;i<=m;i++) pre[i]+=pre[i-1]; for(int i=n;i;i--) sa[pre[rk[i]]--]=i; for(int k=1,num;num <<=1) { num=0; for(int i=n-k+1;i<=n;i++) tp[++num]=i; for(int i=1;i<=n;i++) if(sa[i]>k) tp[++num]=sa[i]-k; sort(); memcpy(tp,rk,sizeof(rk)); rk[sa[1]]=num=1; for(int i=2;i<=n;i++) rk[sa[i]]=(tp[sa[i]]==tp[sa[i-1]]&&tp[sa[i]+k]==tp[sa[i-1]+k])?num:++num; m=num; }}void getheight(){ int k=0; for(int i=1;i<=n;i++) rk[sa[i]]=i; for(int i=1;i<=n;i++) { if(k) k--; int j=sa[rk[i]-1]; while(i+k<=n&&j+k<=n&&ch[j+k]==ch[i+k]) k++; ht[rk[i]]=k; }}int stk[mxn],tt,l[mxn],r[mxn];ll ans;int main(){ //freopen("10.in","r",stdin); scanf("%s",ch+1); n=strlen(ch+1);getSA();getheight(); for(int i=1;i<=n;i++) ans+=(ll)i*(n-1); ht[1]=ht[n+1]=-1;stk[tt=1]=1; for(int i=2;i<=n+1;i++) { while(tt&&ht[i]