题目链接:https://cn.vjudge.net/contest/283743#problem/F

题目大意:给你一个字符串,然后让你求出不同的子串的个数。

具体思路:首先,一个字符串中总的子串个数是len*(len+1)/2,然后就开始去重了,通过height数组,求出所有重复的子串的个数,然后就用总的子串的个数-重复的子串的个数就可以了。

AC代码:

 #include<iostream>
#include<stack>
#include<cstring>
#include<iomanip>
#include<stdio.h>
#include<algorithm>
#include<cmath>
using namespace std;
# define ll long long
const int maxn = 5e5+;
int cntA[maxn], cntB[maxn], sa[maxn], tsa[maxn], A[maxn], B[maxn], height[maxn];
int Rank[maxn];
char ch[maxn];
ll n;
//sa[i]代表第i小的后缀位置,Rank[i]代表第i位置开始的后缀在所有的后缀串中排名第几
// height[i]代表排名第i个字符串和第i-1个字符串的相同前缀的长度
void cal()
{
for(int i = ; i < ; i++) cntA[i] = ;
for(int i = ; i <= n; i++) cntA[ch[i-]]++;
for(int i = ; i < ; i++) cntA[i] += cntA[i-];
for(int i = n; i; i--) sa[cntA[ch[i-]]--] = i;
Rank[sa[]] = ;
for(int i = ; i <= n; i++)
{
Rank[sa[i]] = Rank[sa[i-]];
if(ch[sa[i]-] != ch[sa[i-]-]) Rank[sa[i]]++;
}
for(int l = ; Rank[sa[n]] < n; l <<= )
{
memset(cntA, , sizeof(cntA));
memset(cntB, , sizeof(cntB));
for(int i = ; i <= n; i++)
{
cntA[A[i] = Rank[i]]++;
cntB[B[i] = (i+l <= n)?Rank[i+l]:]++;
}
for(int i = ; i <= n; i++) cntB[i] += cntB[i-];
for(int i = n; i; i--) tsa[cntB[B[i]]--] = i;
for(int i = ; i <= n; i++) cntA[i] += cntA[i-];
for(int i = n; i; i--) sa[cntA[A[tsa[i]]]--] = tsa[i];
Rank[sa[]]=;
for(int i = ; i <= n; i++)
{
Rank[sa[i]] = Rank[sa[i-]];
if(A[sa[i]] != A[sa[i-]] || B[sa[i]] != B[sa[i-]]) Rank[sa[i]]++;
}
}
for(int i = , j = ; i <= n; i++)
{
if(j) j--;
while(ch[i+j-] == ch[sa[Rank[i]-] + j - ]) j++;
height[Rank[i]] = j;
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%s",ch);
n=strlen(ch);
if(n==)
{
printf("1\n");
continue;
}
// cout<<1<<endl;
cal();
ll ans=n*(n+)/;
//cout<<ans<<endl;
for(int i=; i<=n; i++)
{
ans-=height[i];
// cout<<i<<" "<<height[i]<<endl;
}
printf("%lld\n",ans);
}
return ;
}

最新文章

  1. 炫酷的jQuery对话框插gDialog
  2. 使用spring的特殊bean完成配置
  3. GOCR.js – 使用 JS 识别出图片中的文本
  4. Java数据结构之树和二叉树
  5. 通过百度地图API定位--第三方开源--百度地图(一)
  6. 类库探源——System.Configuration 配置信息处理
  7. iOS 改变UILabel部分颜色
  8. Xcode的控制台调试命令
  9. php中判断变量是否为空
  10. 关于UIScrollView属性跟方法的总结
  11. 怎样实现多文件上传 在iOS开发中
  12. 重新想象 Windows 8 Store Apps (22) - 文件系统: 访问文件夹和文件, 通过 AQS 搜索本地文件
  13. SVN 安装与使用教程总结
  14. C++学习-5
  15. MySQL 笔记整理(9) --普通索引和唯一索引,应该怎么选择?
  16. laravel----------carbon时间类的使用介绍
  17. python locust 性能测试:HOOKS&lt;钩子方法&gt;
  18. SpringMVC 与 REST.
  19. 表单相关标签之form标签
  20. linux批量修改文件中包含字符串的查找替换

热门文章

  1. codeforces469B
  2. Centos7 Journald 指令
  3. AISing Programming Contest 2019 翻车记
  4. jQuery文档处理总结
  5. hdu 4417 Super Mario (主席树)
  6. 投入机器学习的怀抱?先学Python吧
  7. 洛谷 P1430 序列取数 解题报告
  8. Jenkins中配置邮件通知实例演示
  9. 树莓派上使用mdk3对无线热点进行DoS攻击
  10. Linux中如何运行.AppImage文件