您的位置:首页 > 其它

JZOJ 1598 文件修复

2016-04-15 19:07 357 查看

Description

有一个文件被破坏了,可是值得庆幸的是,只是文件的顺序被打乱了。文件仅包含大小写的拉丁字母以及逗号,句号和叹号。为了尽快修复,请你找出有多少个至少出现两次的子串。

比如字符串abbabc,子串”a”,”b”,”ab”分别出现了2次,3次,2次。

Analysis

这题是很水的SA了。

首先构造出height,然后至少出现两次的子串怎么算呢?

如下,有3个串

A:aba

B:aabbb

C:aabaaa

设当前做到B和C,B和C的LCT是3,也即会有aab,aa,a这三个串出现了两次以上,所以要把LCT(B,C)加进答案。

但是这样算会有重复,“a”在算LCT(A,B)时已经算过了。所以我们还要减去LCT(A,B)。

这个算法是正确的。因为后缀是排序好的,所以不可能会有这种情况:

A:a

B:aba

C:bab

D:abaa

E:abaaa

所以多次出现过的总会被减去。

Code

int main()
{
scanf("%s",s+1);
n=strlen(s+1);
DA();
getheight();
int ans=0;
fo(i,2,n)
ans+=max(0,height[i]-height[i-1]);
printf("%d",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: