题解:
如果你要是学过后缀数组但是不幸学艺不精,碰见这道题就惨了,可能会掉坑,用什么倍增优化,双排序之类的,然后一个小时就没了哭笑 。其实只要稍稍分析一下就可以发现这真的是一道水题,太水了。 就是算一下从一到字符串长度的每个数的平方和。因为不难证明这个前缀数组的字典序与前缀长度保持一致,因为i-1号前缀一定是i号前缀的前缀,所以说i-1号前缀的字典序小于i号前缀的字典序千万别想着用什么打表O(1)优化,亲身经历,lemon爆掉了,因为文件太大
#include<bits/stdc++.h>
#define M 1000000007
using namespace std;
int n;
long long k;
int read() {
int num=0,f=1;
char ch=getchar();
while(ch>'9'||ch<'0') {
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9') {
num=(num<<1)+(num<<3)+ch-'0';
ch=getchar();
}
return num*f;
}
int main() {
n=read();
char ch=getchar();
while(ch>10) {
ch=getchar();
k++;
}
long long an=0;
for(long long i=1; i<=k; i++) {
an+=(i%M)*(i%M);
an%=M;
}
printf("%lld",an);
return 0;
}