【bzoj3238】[Ahoi2013]差异

Description

Input

一行,一个字符串S

Output

一行,一个整数,表示所求值

Sample Input

cacao

Sample Output

54

题解:

任意两个字符串的lcp是什么,就是如

a,b  那么若a==b 那么为len(a)

  否则设sa[a]<sa[b] 那么为min(height[sa[a]+1-------sa[b]])

 #include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdio> #define N 500007
#define ll long long
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if (ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x*f;
} int n;
int stk[N],f[N],g[N];
struct SA
{
char s[N];
int a[N],b[N],cnta[N],cntb[N],tsa[N],height[N],sa[N],rk[N*];
void Get_SA()
{
for (int i=;i<=;i++)cnta[i]=;
for (int i=;i<=n;i++)cnta[(int)s[i]]++;
for (int i=;i<=;i++)cnta[i]+=cnta[i-];
for (int i=n;i>=;i--)sa[cnta[(int)s[i]]--]=i;
rk[sa[]]=;
for (int i=;i<=n;i++)rk[sa[i]]=rk[sa[i-]]+(s[sa[i]]!=s[sa[i-]]);
for (int i=;rk[sa[n]]!=n;i<<=)
{
for (int j=;j<=n;j++)a[j]=rk[j],b[j]=rk[j+i];
for (int j=;j<=n;j++)cnta[j]=cntb[j]=;
for (int j=;j<=n;j++)cnta[a[j]]++,cntb[b[j]]++;
for (int j=;j<=n;j++)cnta[j]+=cnta[j-],cntb[j]+=cntb[j-];
for (int j=n;j>=;j--)tsa[cntb[b[j]]--]=j;
for (int j=n;j>=;j--)sa[cnta[a[tsa[j]]]--]=tsa[j];
rk[sa[]]=;
for (int j=;j<=n;j++)
rk[sa[j]]=rk[sa[j-]]+(a[sa[j]]!=a[sa[j-]]||b[sa[j]]!=b[sa[j-]]);
}
}
void Get_Height()
{
int len=;
for (int i=;i<=n;i++)
{
if (len)len--;
while(s[i+len]==s[sa[rk[i]-]+len])len++;
height[rk[i]]=len;
}
}
}S;
int main()
{
scanf("%s",S.s+);
n=strlen(S.s+);
ll ans=;
for (int i=;i<=n;i++)
{
ans+=(ll)(i-)*i;
ans+=(ll)i*(i-)/;
}
S.Get_SA();
S.Get_Height();
int tot=;
for (int i=;i<=n;i++)
{
while(tot>&&S.height[i]<S.height[stk[tot]])
f[stk[tot--]]=i-;
stk[++tot]=i;
}
while(tot)f[stk[tot--]]=n;
tot=;
for (int i=n;i>=;i--)
{
while(tot>&&S.height[i]<=S.height[stk[tot]])g[stk[tot--]]=i+;
stk[++tot]=i;
}
while(tot)g[stk[tot--]]=;
for (int i=;i<=n;i++)
ans-=(ll)S.height[i]*(ll)(f[i]-i+)*(ll)(i-g[i]+)*;
printf("%lld\n",ans);
}

最新文章

  1. ASP.NET MVC5+EF6+EasyUI 后台管理系统 (源码购买说明)
  2. POJ2774 (后缀数组)
  3. .Net中使用aliases让相同命名空间的dll引用共存
  4. Python字符串基础一
  5. ffmpeg命令行
  6. jq选中问题
  7. 微信小程序文件结构
  8. JS闭包(转载加整理)
  9. 服务器重写技术:rewrite
  10. SQLSERVER复制表的方法
  11. Ubuntu系列Crontab日记记录
  12. request.getParameter()获取URL中文参数乱码的解决办法
  13. gplots heatmap.2和ggplot2 geom_tile实现数据聚类和热图plot
  14. 【Android 系统开发】 编译 Android文件系统 u-boot 内核 并烧写到 OK-6410A 开发板上
  15. flutter - 01 基础介绍以及ListView
  16. oracle 安装提示未找到文件安装
  17. win10 uwp 读取resw资源文件
  18. 2016310Exp4 恶意代码及分析
  19. nginx最基本操作
  20. 使用 Composer 查看 FastAdmin 项目 组件的版本

热门文章

  1. GitHub和码云的简单使用
  2. [BZOJ] 4145: [AMPPZ2014]The Prices
  3. matplotlib绘图股票走势图实践
  4. manjaro中virtualbox(vbox)配置
  5. 带权并查集:HDU3172-Virtual Friends
  6. hdu 6301
  7. markdown快捷键
  8. 1512 Monkey King
  9. HDU 5527 Too Rich 贪心
  10. POJ 3281 网络流 拆点 Dining