9.26T1
1.荒诞
(absurdity)
【问题描述】
求前缀排序后前缀长度乘以排名的和
【输入】
一个num代表数据组数
一个字符串
【输出】
一个整数,表示答案。
【样例输入1】
7
ABC
【样例输出1】
14
【样例输入2】
5
AAAAAAAAAA
【样例输出2】
385
【数据范围与约定】
【分析】
题面很长,听说过但没写过后缀数组的同学可能会掉入坑中。
仔细理解题意,模拟一次操作,我们会发现排名为 i 的前缀正好是第 i 个前缀。
证明如下:不妨设 s[i]表示 s 的前 i 个字母,也就是第 i 个前缀。
C[i]表示 s 的第 i 个字母。
有 s[i]=s[i-1]+c[i]。因为前 i-1 位相同而最后一位有字符,所以 s[i]>s[i-1]。
证完了这个用头皮都想得出的性质后,原问题变为求解 1 到 n 的平方的和。
注意使用 longlong
大水题,竟然我把1e9写成1e8,40分挂掉了555QAQ
code:
1 #include<iostream> 2 #include<cstdio> 3 #include<string> 4 using namespace std; 5 int main(){ 6 //freopen("absurdity.in","r",stdin); 7 //freopen("absurdity.out","w",stdout); 8 int num; 9 cin>>num; 10 string t; 11 cin>>t; 12 int len=t.size(); 13 long long ans=0; 14 for(int i=1;i<=len;i++){ 15 ans+=1ll*i*i; 16 ans%=1000000007; 17 } 18 cout<<ans; 19 return 0; 20 }