一个论文题,求一个字符串有多少个不同的子串。

每个字符串可以看做一个后缀的前缀,然后,就转换为求每一个后缀中,不同的子串有多少。

每一个后缀,根据长度,可以提供len - sa[i] 个子串,但是,画图可以看出,有一些是重复的,height[i]。

#include <cstdio>
#include <cmath>
#include <cstring>using namespace std;const int maxn = 1000+5;
char str[maxn];int wa[maxn],wb[maxn],wv[maxn],ws[maxn];
int sa[maxn];
int r[maxn];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=0; i<m; i++) ws[i]=0;for(i=0; i<n; i++) ws[x[i]=r[i]]++;for(i=1; i<m; i++) ws[i]+=ws[i-1];for(i=n-1; i>=0; i--) sa[--ws[x[i]]]=i;for(j=1,p=1; p<n; j*=2,m=p){for(p=0,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<n; i++) wv[i]=x[y[i]];for(i=0; i<m; i++) ws[i]=0;for(i=0; i<n; i++) ws[wv[i]]++;for(i=1; i<m; i++) ws[i]+=ws[i-1];for(i=n-1; i>=0; i--) sa[--ws[wv[i]]]=y[i];for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1; i<n; i++)x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;}return;
}int rank[maxn],height[maxn];
void calheight(int *r,int *sa,int n)
{int i,j,k=0;for(i=1; i<=n; i++) rank[sa[i]]=i;for(i=0; i<n; height[rank[i++]]=k)for(k?k--:0,j=sa[rank[i]-1]; r[i+k]==r[j+k]; k++);return;
}int main(int argc, char const *argv[])
{int t;scanf("%d",&t);while(t--) {scanf("%s",str);int len = strlen(str);for(int i=0;i<len;i++)r[i] = str[i];r[len] = 0;da(r,sa,len+1,256);calheight(r,sa,len);int sum = 0;for(int i=1;i<=len;i++) {sum+=len - sa[i] - height[i];}printf("%d\n",sum);}return 0;
}

转载于:https://www.cnblogs.com/TreeDream/p/7360628.html

SPOJ 694 不同子串个数相关推荐

  1. |spoj 694|后缀数组|Distinct Substrings

    spoj 694 给出一个字符串,求字符串中不相同的子串个数. 我们可以知道,字符串中的每个子串都是某个后缀的前缀,于是题目转化为求不相同的后缀的前缀问题.对于每一个SA[k]SA[k]开始的后缀,将 ...

  2. hdu5056(找相同字母不出现k次的子串个数)

    题意:      给你一个字符串,然后问你这个字符串里面有多少个满足要求的子串,要求是每个子串相同字母出现的次数不能超过k. 思路:      这种题目做着比较有意思,而且不是很难(但自己还是嘚瑟,w ...

  3. HDU 3948 不同回文子串个数

    集训队论文中有求不同子串个数的做法,就是扫一遍height数组,过程中根据height数组进行去重.对于本题也是雷同的,只是每一次不是根据与排名在上一位的LCP去重,而是与上一次统计对答案有贡献的后缀 ...

  4. P2408 不同子串个数 SAM

    传送门 文章目录 题意: 思路: 题意: 求sss中本质不同的字串个数. 1≤∣s∣≤1e51\le |s|\le 1e51≤∣s∣≤1e5 思路: 显然, 个数就是∑(len[i]−len[fa[i ...

  5. P2408 不同子串个数

    P2408 不同子串个数 题意: 给你一个长为 n 的字符串,求不同的子串的个数. 我们定义两个子串不同,当且仅当有这两个子串长度不一样或者长度一样且有任意一位不一样. 子串的定义:原字符串中连续的一 ...

  6. [SDOI2016] 生成魔咒(后缀数组SA + st表 + set)动态不同子串个数

    problem luogu-P4070 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1,21,21,2 拼凑起来形成一个魔咒串 [1,2][1,2][1,2]. 一个魔咒串 ...

  7. 【蓝桥杯】算法提高 着急的WYF(不同子串个数)

    算法提高 着急的WYF 问题描述 WYF在战网上的密码非常复杂(含大小写字母.数字以及特殊字符,如"!","@","{"等),但他很不巧地忘 ...

  8. 蓝桥杯 ADV-343 着急的WYF(不同子串个数)

    试题 算法提高 着急的WYF(不同子串个数) 资源限制 时间限制:476ms 内存限制:256.0MB 问题描述 由于战网的密码是一串乱码,WYF巧妙地忘记了他的密码.(他就是作死,如同自掘坟墓.说到 ...

  9. 字符串:字符串顺序比较、11-2删除重复元素、字符串生成器、着急的WYF(不同子串个数)

    字符串顺序比较 问题描述比较两个字符串s1和s2,输出:0表示s1与s2相等:1表示s1的字母序先于s2:-1表示s1的字母序后于s2输入格式输入两行,第一行输入一个字符串1,第二行输入字符串2.输出 ...

最新文章

  1. 局部响应归一化(Local Response Normalization)
  2. AI也用思维导图:教它像人类一样高效规划
  3. LAMP编译安装之———httpd
  4. 如何解决实际错误:配置IIS使其支持SSL加密的HTTPS,并且要求浏览器客户端证书
  5. 47、Power Query-处理典型的中国式二维表格转一维
  6. linux smtp 发送邮件乱码,使用gomail发送邮件之解决附件名乱码的问题
  7. centos 虚拟机glibc升级_分享Centos6.5升级glibc过程
  8. SpyEye on Android
  9. matlab控制读取数小数位,matlab输出的数值型矩阵中如何控制小数位数,以及对齐方式?...
  10. mysql导出到excel方法汇总
  11. 【基于Android的连连看游戏的设计与实现】
  12. 一个游戏程序员的学习资料(全是好书)
  13. Google退出内地市场
  14. 重庆市渝中区相关部门负责人到访 Conflux 探讨新一线城市区块链技术发展路径...
  15. mysql eav_Magento的EAV模型窥探
  16. 前端基础CSS+html篇 2w字吐血总结
  17. 不管你学的是什么专业,你都应该多少懂些管理学的东西-----【管理学十大经典定理}...
  18. 使用v-show时,当isshow:false时,在页面刷新的过程中,isshow依然会短暂显示一下...
  19. Linux进程的详细内容
  20. 影视列表(20211117更新)

热门文章

  1. 告诫那些有创业梦的大学生,切记千万不要盲目创业!
  2. linux 替换文件中某个字符串_word中如何删除包含某个特定字符串的整个段落?...
  3. 信号状态关_路由器要不要关?难怪信号越来越差
  4. php mysql旅游论文,php143 基于PHP+Mysql的旅游之家网页设计
  5. c语言自定义char*函数返回值是乱码_[每日C语言」printf()函数的修饰符和返回值...
  6. 【java】浅谈注释
  7. Java的注释(详细版)
  8. maya批量命名插件_教你玩转MAYA的四十二精华造诣(第一期)
  9. iOS超全开源框架、项目和学习资料汇总(1)UI篇
  10. uni-app h5页面左上角出现“取消“字眼解决办法