个人第一道后缀数组题目。
对于每一个后缀suffix(i),都有len-sa[i]个前缀(也即有len-sa[i]个不同的字符串),其中与排名前一位的后缀有height[i]个共同的前缀,最后所得到的新的字符串个数为len-sa[i]-height[i].因此这题只要求出sa以及height即可求得答案。

#include<stdio.h>
#include<string.h>
#define maxn 100010
int wa[maxn];
int wb[maxn];
int wv[maxn];
int wsa[maxn];
int ranks[maxn],height[maxn]; void calheight(int *r,int *sa,int n)
{
int i,j,k=;
for(i=;i<=n;i++) ranks[sa[i]]=i;
for(i=;i<n ;height[ranks[i++]]=k)
for(k?k--:,j=sa[ranks[i]-];r[i+k]==r[j+k];k++);
return;
} int cmp(int *r,int a,int b,int l)
{
return r[a]==r[b]&&r[a+l]==r[b+l];
}; void da(int *r,int *sa,int n,int m)
{
int i,j,p,*x=wa,*y=wb,*t;
for(i=;i<m;i++) wsa[i]=;
for(i=;i<n;i++) wsa[x[i]=r[i]]++;
for(i=;i<m;i++) wsa[i]+=wsa[i-];
for(i=n-;i>=;i--) sa[--wsa[x[i]]]=i;
for(j=,p=;p<n;j*=,m=p)
{
for(p=,i=n-j;i<n;i++) y[p++]=i;
for(i=;i<n;i++) if(sa[i]>=j) y[p++]=sa[i]-j;
for(i=;i<n;i++) wv[i]=x[y[i]];
for(i=;i<m;i++) wsa[i]=;
for(i=;i<n;i++) wsa[wv[i]]++;
for(i=;i<m;i++) wsa[i]+=wsa[i-];
for(i=n-;i>=;i--) sa[--wsa[wv[i]]]=y[i];
for(t=x,x=y,y=t,p=,x[sa[]]=,i=;i<n;i++)
x[sa[i]]=cmp(y,sa[i-],sa[i],j)?p-:p++;
}
return;
} int r[maxn];
int sa[maxn];
int main()
{
char str[maxn];
int t,i;
scanf("%d",&t);
while(t--)
{
scanf("%s",str);
memset(r, ,sizeof(r));
memset(sa, , sizeof(sa));
int len = strlen(str);
for (i = ; i < len; ++i)
{
r[i] = (int)str[i];
}
da(r, sa, len + , );
calheight(r, sa, len);
int sum = ;
for(i=;i<len;i++)
sum += len-sa[i+]-height[i+];
printf("%d\n",sum);
}
return ;
}

spoj694--Distinct Substrings的更多相关文章

  1. Distinct Substrings(spoj694)(sam(后缀自动机)||sa(后缀数组))

    Given a string, we need to find the total number of its distinct substrings. Input \(T-\) number of ...

  2. spoj694 DISUBSTR - Distinct Substrings

    Given a string, we need to find the total number of its distinct substrings. Input T- number of test ...

  3. SPOJ694 New Distinct Substrings

    New Distinct Substrings 题目大意 给定一个字符串,求本质不同的子串个数 题解 SA常见思想:每一个子串都是某个后缀的前缀 考虑每一个后缀的贡献,首先他拥有n - sa[i]个( ...

  4. 后缀数组---New Distinct Substrings

    Description Given a string, we need to find the total number of its distinct substrings. Input T- nu ...

  5. SPOJ 694. Distinct Substrings (后缀数组不相同的子串的个数)转

    694. Distinct Substrings Problem code: DISUBSTR   Given a string, we need to find the total number o ...

  6. 后缀数组:SPOJ SUBST1 - New Distinct Substrings

    Given a string, we need to find the total number of its distinct substrings. Input T- number of test ...

  7. DISUBSTR - Distinct Substrings

    DISUBSTR - Distinct Substrings no tags  Given a string, we need to find the total number of its dist ...

  8. 705. New Distinct Substrings spoj(后缀数组求所有不同子串)

    705. New Distinct Substrings Problem code: SUBST1 Given a string, we need to find the total number o ...

  9. 【SPOJ】Distinct Substrings(后缀自动机)

    [SPOJ]Distinct Substrings(后缀自动机) 题面 Vjudge 题意:求一个串的不同子串的数量 题解 对于这个串构建后缀自动机之后 我们知道每个串出现的次数就是\(right/e ...

  10. 【SPOJ】Distinct Substrings/New Distinct Substrings(后缀数组)

    [SPOJ]Distinct Substrings/New Distinct Substrings(后缀数组) 题面 Vjudge1 Vjudge2 题解 要求的是串的不同的子串个数 两道一模一样的题 ...

随机推荐

  1. UICollectionView特殊布局

    流式http://www.code4app.com/thread-30894-1-1.html 美团http://www.code4app.com/thread-30930-1-1.html 复杂布局 ...

  2. 微信小程序 列表倒计时

    最近要实现一个列表倒计时的功能,写了个demo 展示图 <view class="center colu"> <view class="time&quo ...

  3. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 排版:将所有列表项放置同一行

    <!DOCTYPE html> <html> <head> <title>菜鸟教程(runoob.com)</title> <meta ...

  4. .NET精彩博文

    vs2019安装和使用教程(详细) 为什么选择.NETCore? C#中Socket的简单使用

  5. JS html页面

    js窗口置顶 if (window != top) top.location.href = location.href; js打开新窗口 js window.open()弹出窗口参数说明及居中设置 f ...

  6. StringUtils工具类中的isBlank()方法和isEmpty()方法的区别

    1.isBlank()方法 1 public static boolean isBlank(String str) { 2 int strLen; 3 if (str == null || (strL ...

  7. Linux进程管理(一)

    目录 Linux进程管理(一) 参考 pstree命令 pidof命令 pmap命令 pwdx命令 ps命令 nice调优 发送信号 Linux进程管理(一)

  8. 通过Java创建XML(中文乱码已解决)

    package com.zyb.xml; import java.io.FileOutputStream; import java.io.OutputStream; import java.io.Ou ...

  9. 「AT2021」キャンディーとN人の子供 / Children and Candies

    前言 今天练习赛出了这道题,由于我太菜没有在考场上做出来. 翻了题解后,感觉题解讲的并不是十分直观,所以自己写一篇. 题目大意 太长了,不讲了. 数据范围: \(1\leq N\leq 400\) \ ...

  10. PowerHandle管理页面

    HljioGBjiomGiiuHJKYiubfcgydftyjkKHKHIUvghcghftyfhkHJKGHJKguyjljklhJKGUYGUYhjklhfgtydtyGHJgHJUGuy HKk ...