[JZOJ1598]文件修复

来源:互联网 发布:windows运行命令快捷键 编辑:程序博客网 时间:2024/06/13 19:53

Description

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

Solution

这是一道SA的题目

对于排好序的每个后缀

  • abbabc
  • abc
  • babc
  • bbabc
  • bc
  • c

做到第i个后缀时,我们只考虑以这一后缀开头为开头的子串
显然Ans应该加上height[i]
然而可能有的字符已经算过了,要减掉重复的
对于每一种算过的子串,只保留一个,其他的都要减掉,那就把每一次的height[i1]减掉就好(如果这一次有的话)

所以每一次就减max(0,height[i]height[i1])

下面只贴主程序

Code

int main(){    scanf("%s",st+1);    n=strlen(st+1);    int i;    fo(i,1,n)     {        int cm=st[i];        m=max(m,cm);    }    findSA();    findheight();    int ans=0;    fo(i,2,n) ans+=max(0,height[i]-height[i-1]);//关键    cout<<ans;}
1 0