不相同的子串的个数

给定一个字符串,该问题旨在找出所有不相同的子串数量。通过考虑每个子串是某个后缀的前缀,可以将问题转化为计算不同后缀的不相同前缀个数。解决方案涉及到后缀数组和高度数组的概念,通过增加后缀的数量并减去重复的前缀来得出答案。
摘要由CSDN通过智能技术生成

不相同的子串的个数

题目描述

 

给定一个字符串,求不相同的子串的个数。

 

 

输入

 

 输入数据第一行为一个数字T,表示数据组数。(T<=10)

接下来的T行,每行一个由小写或大写字母构成的字符串,字符串长度不超过50000。

 

输出

 

 对于每组数据,输出一行一个数字,表示答案。

 

样例输入

4
abbabba
dabddkababa
bacaba
baba

样例输出

17
55
17
7

提示

 

【题目来源】
spoj694,spoj705

sulotion

由于每个子串一定是某个后缀的前缀,相当于就是求后缀之间不相同前缀的个数.

加上(n-sa[i]+1)个新前缀,减掉height[i]个已经算过了。

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 500005
using namespace std;
int n,m,sa[maxn],rk[maxn],tp[maxn],tax[maxn],p;
int height[maxn],T;
char s[maxn];
long long ans;
void Qsort(){
    for(int i=0;i<=m;i++)tax[i]=0;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值