spoj705
题解:
后缀数组求出height
然后ans=所有串-所有height
代码:
- #include<bits/stdc++.h>
- using namespace std;
- const int N=;
- int t,ans,n,m,wa[N],wb[N],wsf[N],wv[N],sa[N],rank[N],height[N],s[N],a[N];
- char str[N],str1[N],str2[N];
- int cmp(int *r,int a,int b,int k)
- {
- return r[a]==r[b]&&r[a+k]==r[b+k];
- }
- void getsa(int *r,int *sa,int n,int m)
- {
- int *x=wa,*y=wb;
- for (int i=;i<m;i++)wsf[i]=;
- for (int i=;i<n;i++)wsf[x[i]=r[i]]++;
- for (int i=;i<m;i++)wsf[i]+=wsf[i-];
- for (int i=n-;i>=;i--)sa[--wsf[x[i]]]=i;
- for (int p=,j=;p<n;j*=,m=p)
- {
- p=;
- for (int i=n-j;i<n;i++)y[p++]=i;
- for (int i=;i<n;i++)
- if (sa[i]>=j)y[p++]=sa[i]-j;
- for (int i=;i<n;i++)wv[i]=x[y[i]];
- for (int i=;i<m;i++)wsf[i]=;
- for (int i=;i<n;i++)wsf[wv[i]]++;
- for (int i=;i<m;i++)wsf[i]+=wsf[i-];
- for (int i=n-;i>=;i--)sa[--wsf[wv[i]]]=y[i];
- swap(x,y);x[sa[]]=;p=;
- for (int i=;i<n;i++)x[sa[i]]=cmp(y,sa[i-],sa[i],j)?p-:p++;
- }
- }
- void getheight(int *r,int n)
- {
- int j,k=;
- for (int i=;i<=n;i++)rank[sa[i]]=i;
- for (int i=;i<n;i++)
- {
- if (k)k--;
- else k=;
- j=sa[rank[i]-];
- while (r[i+k]==r[j+k])k++;
- height[rank[i]]=k;
- }
- }
- int main()
- {
- scanf("%d",&t);
- while (t--)
- {
- scanf("%s",str);
- int len=strlen(str);
- for (int i=;i<len;i++)s[i]=str[i];
- s[len]=;
- getsa(s,sa,len+,);
- getheight(s,len);
- int ans=(+len)*len/;
- for (int i=;i<=len;i++)ans-=height[i];
- printf("%d\n",ans);
- }
- }
spoj705的更多相关文章
- Cogs 1709. [SPOJ705]不同的子串 后缀数组
题目:http://cojs.tk/cogs/problem/problem.php?pid=1709 1709. [SPOJ705]不同的子串 ★★ 输入文件:subst1.in 输出文件: ...
- 【spoj705】 Distinct Substrings
[题目描述] 给定一个字符串,计算其不同的子串个数. [输入格式] 一行一个仅包含大写字母的字符串,长度<=50000 [输出格式] 一行一个正整数,即不同的子串个数. [样例输入] ABABA ...
- spoj705 后缀数组求不同子串的个数
http://www.spoj.com/problems/SUBST1/en/ 题目链接 SUBST1 - New Distinct Substrings no tags Given a stri ...
- [SPOJ705]不同的子串
题目描述] 给定一个字符串,计算其不同的子串个数. [输入格式] 一行一个仅包含大写字母的字符串,长度<=50000 [输出格式] 一行一个正整数,即不同的子串个数. [样例输入] ABABA ...
- SPOJ 694&&SPOJ705: Distinct Substrings
DISUBSTR - Distinct Substrings 链接 题意: 询问有多少不同的子串. 思路: 后缀数组或者SAM. 首先求出后缀数组,然后从对于一个后缀,它有n-sa[i]-1个前缀,其 ...
- SPOJ705 SUBST1 - New Distinct Substrings(后缀数组)
给一个字符串求有多少个不相同子串. 每一个子串一定都是某一个后缀的前缀.由此可以推断出总共有(1+n)*n/2个子串,那么下面的任务就是找这些子串中重复的子串. 在后缀数组中后缀都是排完序的,从sa[ ...
- SPOJ705 Distinct Substrings (后缀自动机&后缀数组)
Given a string, we need to find the total number of its distinct substrings. Input T- number of test ...
- [spoj694&spoj705]New Distinct Substrings(后缀数组)
题意:求字符串中不同子串的个数. 解题关键:每个子串一定是某个后缀的前缀,那么原问题等价于求所有后缀之间的不相同的前缀的个数. 1.总数减去height数组的和即可. 注意这里height中为什么不需 ...
- 北京培训记day2
后缀三姐妹 P.S.后缀大家族关系:后缀自动机fail指针=后缀树,后缀树前序遍历=后缀数组 一.后缀数组:orz罗穗骞集训队论文 给每个后缀按字典序排序 rank[]表示从i开始的后缀排名多少 sa ...
随机推荐
- Codeforces 1016 E - Rest In The Shades
E - Rest In The Shades 思路: 相似 红色的长度等于(y - s) / y 倍的 A' 和 B' 之间的 fence的长度 A' 是 p 和 A 连线和 x 轴交点, B'同理 ...
- HDU 4804 Campus Design
HDU 4804 思路: 轮廓线dp #include<bits/stdc++.h> using namespace std; #define fi first #define se se ...
- legend2---开发日志8(thinkphp和vue如何配合才能达到最优)
legend2---开发日志8(thinkphp和vue如何配合才能达到最优) 一.总结 一句话总结:凡是php可以做的,都可以先在后端处理好数据,然后再丢给前端 凡php可以做的,都可以先在后端处理 ...
- 昂达 v891 连接上adb 调试
这篇文章可以删除了. 可以看看有关v891root和分区的文章,里面介绍了驱动程序的工具了. USB线连上之后,可以直接访问文件,所以连接本身肯定没有问题的. 可是,总是Windows 那边MTP驱 ...
- Solaris 10 disable ipv6
亲测有效:) http://thegeekdiary.com/how-to-remove-ipv6-in-solaris-11/
- MySQL utf8 和 utf8mb4 的区别
utf-8 时变化长度的编码,储存一个code point 需要1~4个字节. 然而,mysql的utf8只存储最多3个字节per code point. 所以,utf8字符集不能存储所有的unico ...
- 算法:最短路径之弗洛伊德(Floyd)算法
https://cloud.tencent.com/developer/article/1012420 为了能讲明白弗洛伊德(Floyd)算法的主要思想,我们先来看最简单的案例.图7-7-12的左图是 ...
- 20180518VSTO多簿单表汇总外接程序按钮
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsof ...
- POJ-2955 Brackets(括号匹配问题)
题目链接:http://poj.org/problem?id=2955 这题要求求出一段括号序列的最大括号匹配数量 规则如下: the empty sequence is a regular brac ...
- 用where导致group by分组字段的索引失效
把两个单独的索引合并成一个组合索引,即把where条件字段的索引和group by的分组字段索引组合成一个. 如果分组的字段需要用函数处理,可以用索引函数 Generated Column(函数索引) ...