SPOJ 题目705 New Distinct Substrings(后缀数组,求不同的子串个数)
SUBST1 - New Distinct Substrings
Given a string, we need to find the total number of its distinct substrings.
Input
T- number of test cases. T<=20; Each test case consists of one string, whose length is <= 50000
Output
For each test case output one number saying the number of distinct substrings.
Example
- Input:
- 2
- CCCCC
- ABABA
- Output:
- 5
- 9
ac代码
- #include<stdio.h>
- #include<string.h>
- #include<algorithm>
- #include<iostream>
- #define min(a,b) (a>b?b:a)
- #define max(a,b) (a>b?
- a:b)
- using namespace std;
- char str[50010];
- int sa[50100],Rank[50100],rank2[50100],height[50010],c[50100],*x,*y,s[50100];
- int n;
- void cmp(int n,int sz)
- {
- int i;
- memset(c,0,sizeof(c));
- for(i=0;i<n;i++)
- c[x[y[i]]]++;
- for(i=1;i<sz;i++)
- c[i]+=c[i-1];
- for(i=n-1;i>=0;i--)
- sa[--c[x[y[i]]]]=y[i];
- }
- void build_sa(int *s,int n,int sz)
- {
- x=Rank,y=rank2;
- int i,j;
- for(i=0;i<n;i++)
- x[i]=s[i],y[i]=i;
- cmp(n,sz);
- int len;
- for(len=1;len<n;len<<=1)
- {
- int yid=0;
- for(i=n-len;i<n;i++)
- {
- y[yid++]=i;
- }
- for(i=0;i<n;i++)
- if(sa[i]>=len)
- y[yid++]=sa[i]-len;
- cmp(n,sz);
- swap(x,y);
- x[sa[0]]=yid=0;
- for(i=1;i<n;i++)
- {
- if(y[sa[i-1]]==y[sa[i]]&&sa[i-1]+len<n&&sa[i]+len<n&&y[sa[i-1]+len]==y[sa[i]+len])
- x[sa[i]]=yid;
- else
- x[sa[i]]=++yid;
- }
- sz=yid+1;
- if(sz>=n)
- break;
- }
- for(i=0;i<n;i++)
- Rank[i]=x[i];
- }
- void getHeight(int *s,int n)
- {
- int k=0;
- for(int i=0;i<n;i++)
- {
- if(Rank[i]==0)
- continue;
- k=max(0,k-1);
- int j=sa[Rank[i]-1];
- while(s[i+k]==s[j+k])
- k++;
- height[Rank[i]]=k;
- }
- }
- int main()
- {
- int t;
- scanf("%d",&t);
- while(t--)
- {
- int i;
- scanf("%s",str);
- int len=strlen(str);
- for(i=0;i<len;i++)
- s[i]=str[i];
- s[len]=0;
- build_sa(s,len+1,260);
- getHeight(s,len);
- int sum=0;
- for(i=1;i<=len;i++)
- {
- sum+=len-sa[i]-height[i];
- }
- printf("%d\n",sum);
- }
- }
SPOJ 题目705 New Distinct Substrings(后缀数组,求不同的子串个数)的更多相关文章
- SPOJ - SUBST1 New Distinct Substrings —— 后缀数组 单个字符串的子串个数
题目链接:https://vjudge.net/problem/SPOJ-SUBST1 SUBST1 - New Distinct Substrings #suffix-array-8 Given a ...
- 【SPOJ – SUBST1】New Distinct Substrings 后缀数组
New Distinct Substrings 题意 给出T个字符串,问每个字符串有多少个不同的子串. 思路 字符串所有子串,可以看做由所有后缀的前缀组成. 按照后缀排序,遍历后缀,每次新增的前缀就是 ...
- POJ3415 Common Substrings —— 后缀数组 + 单调栈 公共子串个数
题目链接:https://vjudge.net/problem/POJ-3415 Common Substrings Time Limit: 5000MS Memory Limit: 65536K ...
- spoj 694. Distinct Substrings 后缀数组求不同子串的个数
题目链接:http://www.spoj.com/problems/DISUBSTR/ 思路: 每个子串一定是某个后缀的前缀,那么原问题等价于求所有后缀之间的不相同的前缀的个数.如果所有的后缀按照su ...
- 705. New Distinct Substrings spoj(后缀数组求所有不同子串)
705. New Distinct Substrings Problem code: SUBST1 Given a string, we need to find the total number o ...
- SPOJ 694 || 705 Distinct Substrings ( 后缀数组 && 不同子串的个数 )
题意 : 对于给出的串,输出其不同长度的子串的种类数 分析 : 有一个事实就是每一个子串必定是某一个后缀的前缀,换句话说就是每一个后缀的的每一个前缀都代表着一个子串,那么如何在这么多子串or后缀的前缀 ...
- SPOJ - DISUBSTR Distinct Substrings (后缀数组)
Given a string, we need to find the total number of its distinct substrings. Input T- number of test ...
- SPOJ DISUBSTR Distinct Substrings 后缀数组
题意:统计母串中包含多少不同的子串 然后这是09年论文<后缀数组——处理字符串的有力工具>中有介绍 公式如下: 原理就是加上新的,减去重的,这题是因为打多校才补的,只能说我是个垃圾 #in ...
- spoj Distinct Substrings 后缀数组
给定一个字符串,求不相同的子串的个数. 假如给字符串“ABA";排列的子串可能: A B A AB BA ABA 共3*(3+1)/2=6种; 后缀数组表示时: A ABA BA 对于A和 ...
随机推荐
- CSS隐藏overflow默认滚动条同时保留滚动效果
主要应用于移动端场景,仿移动端滚动效果.对于隐藏滚动条,众所周知overflow:hidden,但是想要的滚动效果也没了. 所以对于移动端webkit内核提供一个伪类选择器: .element::-w ...
- ofbiz初级教程
本教程是ofbiz 基本应用,它涵盖了OFBiz应用程序开发过程的基本原理.目标是使开发人员熟悉最佳实践,编码惯例,基本控制流程以及开发人员对OFBiz定制所需的所有其他方面. 本教程将帮助您在OFB ...
- POJ 题目2774 Long Long Message(后缀数组,求最长公共子串长度)
Long Long Message Time Limit: 4000MS Memory Limit: 131072K Total Submissions: 23696 Accepted: 97 ...
- 跟我学设计模式视频教程——适配器模式,适配器模式VS装饰模式
课程视频 适配器模式 适配器模式VS装饰模式 唠嗑 课程笔记 课程笔记 课程代码 课程代码 新课程火热报名中 课程介绍
- Baby_Step,Gaint_Step(分析具体解释+模板)
下面是总结自他人博客资料.以及本人自己的学习经验. [Baby_Step,Gaint_Step定义] 高次同余方程. BL == N (mod P) 求解最小的L.因为数据范围非常大,暴力不行 这里用 ...
- zzulioj--1777--和尚特烦恼3——何时能下山(水题)
1777: 和尚特烦恼3--何时能下山 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 203 Solved: 111 SubmitStatusWeb ...
- [ZJOJ2014] 力 解题报告 (FFT)
题目链接: https://www.luogu.org/problemnew/show/P3338 题目: 给出$n$个数$q_i$,令$F_j=\sum_{i<j}\frac{q_iq_j}{ ...
- MHA+ProxySQL 读写分离高可用
文档结构如下: 1.ProxySQL说明 ProxySQL是mysql的一款中间件的产品,是灵活的mysql代理层,可以实现读写分离,支持query路由器的功能,支持动态指定sql进行缓存,支持动态加 ...
- ASP页面的执行顺序
http://hi.baidu.com/yanjiezhu/item/29c113c3912e2a0ac710b2d3 1.对象初始化(OnInit方法) 页面中的控件(包括页面本身)都是在它们最初的 ...
- UVa 10943 How do you add?【递推】
题意:给出n,k,问恰好有k个不超过n的数的和为n的方案数有多少 可以隔板法来做 现在有n个小球放到k个盒子里面,盒子可以为空 那么就是n-k+1个缝隙,放上k-1个隔板(k-1个隔板就分成了k份) ...