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 }

 

posted @ 2018-09-26 11:54  saionjisekai  阅读(32)  评论(0编辑  收藏  举报