SPOJ - DISUBSTR Distinct Substrings

2023-12-22 08:48

本文主要是介绍SPOJ - DISUBSTR Distinct Substrings,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.题面

http://www.spoj.com/problems/DISUBSTR/en/

2.题意

问一个字符串中有多少个不同的子串

3.思路

参考《后缀数组 罗穗蹇》中的思路,很好写

4.代码

/*****************************************************************> File Name: Cpp_Acm.cpp> Author: Uncle_Sugar> Mail: uncle_sugar@qq.com> Created Time: 2016年07月29日 星期五 20时13分08秒
*****************************************************************/
# include <cstdio>
# include <cstring>
# include <cctype>
# include <cmath>
# include <cstdlib>
# include <climits>
# include <iostream>
# include <iomanip>
# include <set>
# include <map>
# include <vector>
# include <stack>
# include <queue>
# include <algorithm>
using namespace std;struct QuickIO{QuickIO(){const int SZ = 1<<20;setvbuf(stdin ,new char[SZ],_IOFBF,SZ);setvbuf(stdout,new char[SZ],_IOFBF,SZ);}				//*From programcaicai*//
}QIO;template<class T>void PrintArray(T* first,T* last,char delim=' '){ for (;first!=last;first++) cout << *first << (first+1==last?'\n':delim); 
}const int debug = 1;
const int size  = 10 + 200000 ; 
const int INF = INT_MAX>>1;
typedef long long ll;const int MAXN = 2*100000+10;int t1[MAXN],t2[MAXN],c[MAXN];bool cmp(int *r,int a,int b,int l){return r[a]==r[b]&&r[a+l]==r[b+l];
}void da(char str[],int sa[],int rrank[],int height[],int n,int m){n++;int i, j, p, *x = t1, *y = t2;for (i = 0;i < m;i++) c[i] = 0;for (i = 0;i < n;i++) c[x[i] = str[i]]++;for (i = 1;i < m;i++) c[i] += c[i-1];for (i = n-1;i >= 0;i--) sa[--c[x[i]]] = i;for (j = 1;j <= n; j<<= 1){p = 0;for (i = n-j; i < n; i++)	y[p++] = i;for (i = 0; i < n; i++)	if (sa[i] >= j) y[p++] = sa[i] - j; for (i = 0; i < m; i++) c[i] = 0;for (i = 0; i < n; i++) c[x[y[i]]]++;for (i = 1; i < m; i++) c[i] += c[i-1];for (i = n-1;i >= 0; i--) sa[--c[x[y[i]]]] = y[i];swap(x,y);p = 1; x[sa[0]] = 0;for (i = 1; i < n; i++){x[sa[i]] = cmp(y,sa[i-1],sa[i],j)?p-1:p++;}if ( p>=n ) break;m = p;}int k = 0;n--;for (i = 0; i<= n; i++) rrank[sa[i]] = i;for (i = 0; i< n; i++){if (k) k--;j = sa[rrank[i]-1];while (str[i+k] == str[j+k]){k++;}height[rrank[i]] = k;}
}int rrank[MAXN],height[MAXN];
int sa[MAXN];char str[size];int main()
{std::ios::sync_with_stdio(false);cin.tie(0);int i,j;int T;cin >> T;while (T--){cin >> str;int len = strlen(str); //# void da(char str[],int sa[],int rrank[],int height[],int n,int m){da(str,sa,rrank,height,len,128);//# for (i=1;i<=len;i++){//# cout << "*" << i << "* ";//# PrintArray(str+sa[i],str+len);//# }//# cout << endl;ll ans = len - sa[1];//# cout << "ans = " << ans << endl;for (i=2;i<=len;i++){ans += len - sa[i] - height[i];}	cout << ans << endl;}return 0;
}


这篇关于SPOJ - DISUBSTR Distinct Substrings的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/523321

相关文章

【SPOJ】1825 Free tour II 点分治

传送门:【SPOJ】1825 Free tour II 题目分析:敲了两遍。。。 本题是论文题,具体见漆子超论文《分治算法在树的路径问题中的应用》。 在以root为根的第 i 棵子树上,我们用G[ i ,j ]表示root的第 i 棵子树的路径上严格有 j 个黑点的路径的最长长度。用F[ i ,j ]表示在root为根的第 i 棵子树的路径上不超过 j 个黑点的路径的最长长度。因

【SPOJ】Triple Sums【FFT】

传送门:【SPOJ】Triple Sums 题目分析: 首先我们不考虑 i<j<k i<j<k这个条件,构造多项式: Y=∑xai \qquad\qquad\qquad Y = \sum x^{a_i} 那么 ai+aj+ak=S ai+aj+ak=S的个数即 xai+aj+ak=S x^{a_i+a_j+a_k=S}的个数,等价于 Y3中xS Y^3中x^S的系数。 然后我们考虑容斥

CodeForces 386C Diverse Substrings

题意: 一个字符串的价值等于它包含的不同字母的个数(abcdabcdabcd 的价值为4) 给你一个字符串  求该字符串所有子串的价值 输出最大的价值是多少  再分别输出价值为x的字符串有多少个 思路: MAXstringlen=3*10^5  数据较大  所以我首先尝试可否从左到右扫描一遍每次添加一个字符的想法 但是最简单的加一个字符回头判断一下价值为x的字符串增加了多少个复杂

CodeForces 451D Count Good Substrings

题意: 一个只包含a和b的字符串  问  它有几个长度为偶数和长度为奇数的“压缩回文串”  压缩的概念是  相邻的相同字符压缩成一个字符 思路: 串经过压缩一定满足如下形式 ……ababab……  那么这样只要两端的字符相同则中间一定是回文的  因此对于一个a它作为左端点形成的回文串个数就等于它右边的a的个数  那么长度是奇数还是偶数呢  可以这么判断  如果a在奇数位置上和它匹配的a也在奇

Longest Substring with At Most K Distinct Characters

Given a string, find the length of the longest substring T that contains at mostk distinct characters. For example,Given s = “eceba” and k = 2, T is "ece" which its length is 3. 思路:跟  Longest Sub

Longest Substring with At Most Two Distinct Characters

Given a string, find the length of the longest substring T that contains at most 2 distinct characters. For example,Given s = “eceba”, T is "ece" which its length is 3. 思路:同向双指针,跟Longest Substrin

iReport利用Print Repeated Values做分组报表以及对重复值做distinct运算

iReport自带的分组功能有可能是比较符合西方的分组标准,对于中国人来说希望显示方便、节省纸张,对于iReport实现起来就稍微复杂一点了。 本文所用demo地址:http://download.csdn.net/detail/u013284604/6812623 iReport版本 5.1.0,demo所用数据源:json数据源 一、iReport利用Print Repeated Val

SparkRDD之distinct和first

distinct:对RDD中的元素进行去重。 first:返回RDD中第一个元素。 package com.cb.spark.sparkrdd;import java.util.Arrays;import org.apache.spark.SparkConf;import org.apache.spark.api.java.JavaRDD;import org.apache.spark.a

SQL中distinct 和 row_number() over() 的区别及用法

1 前言 在咱们编写 SQL 语句操作数据库中的数据的时候,有可能会遇到一些不太爽的问题,例如对于同一字段拥有相同名称的记录,我们只需要显示一条,但实际上数据库中可能含有多条拥有相同名称的记录,从而在检索的时候,显示多条记录,这就有违咱们的初衷啦!因此,为了避免这种情况的发生,咱们就需要进行“去重”处理啦,那么何为“去重”呢?说白了,就是对同一字段让拥有相同内容的记录只显示一条记录。 那么,如

【SPOJ】【AGGRCOW】

总结:函数之间存在依赖。  然后一处修改了但是忘记修改另外的一处了。。。 #include <iostream>#include <cstring>#include <cmath>#include <queue>#include <stack>#include <list>#include <map>#include <set>#include <string>#inclu