题目描述:

给定一个由小写字母组成的字符串,求它的所有连续子串中,出现过至少两次,且至少有一对出现的重复子串是不重合的连续子串个数。
如给定字符串aaaa,aa和a,符合条件,aaa不符合条件(出现重合),故答案为2。

输入:

输入包含多组测试用例,每组测试用例包含一个字符串,由小写字母组成,其长度不大于1000。

输出:

对于每组测试数据,输出一个整数,代表符合条件的子串个数。

样例输入:
aaaa
aaa
样例输出:
2
1
来源:
2014年王道论坛计算机考研机试全真模拟考试

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<ctype.h>
#include<algorithm>
usingnamespace std;
constint MAX=2000;chars[MAX];
intdp[MAX][20];
intsa[MAX],rank[MAX];
intbuc[MAX],sto[2][MAX];
charmod[MAX];
intr[MAX];
intLog[MAX];
inth[MAX];//sa[i],sa[i-1]最长公共前缀
boolcmp(int*y,inta,intb,intj)
{returny[a]==y[b]&&y[a+j]==y[b+j];}
//排序0-n,SA有用的是1-n,RANK有用的是0-n
//给定字符后面要加两个0,n传入实际长度
voidmake_suffix_arr(ints[],intn,intm)
{int*x=sto[0],*y=sto[1],*t;inti,j,p;n++;for(i=0;i<m;i++)buc[i]=0;for(i=0;i<n;i++)buc[x[i]=s[i]]++;for(i=1;i<m;i++)buc[i]+=buc[i-1];for(i=n-1;i>=0;i--)sa[--buc[x[i]]]=i;for(p=j=1;p<n;j<<=1,m=p){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++)buc[i]=0;for(i=0;i<p;i++)buc[x[y[i]]]++;for(i=1;i<m;i++)buc[i]+=buc[i-1];for(i=n-1;i>=0;i--)sa[--buc[x[y[i]]]]=y[i];for(t=x,x=y,y=t,i=p=1,x[sa[0]]=0;i<n;i++)x[sa[i]]=cmp(y,sa[i],sa[i-1],j)?p-1:p++;}
}
voidcal_height(intn)
{inti,k=0,j;for(i=0;i<=n;i++)rank[sa[i]]=i;for(h[i=0]=0;i<n;h[rank[i++]]=k)for(k?k--:0,j=sa[rank[i]-1];r[i+k]==r[j+k];k++);
}
voidget_RMQ(intn)
{inti,j;inta,b;for(i=0;i<=n;i++)dp[i][0]=i;for(j=1;(1<<j)<=n;j++)for(i=1;i+(1<<j)-1<=n;i++){a=dp[i][j-1];b=dp[i+(1<<j>>1)][j-1];if(h[a]<h[b])dp[i][j]=a;elsedp[i][j]=b;}
}
intaskRMQ(intl,intr)
{intt=Log[r-l+1];inta=h[dp[l][t]],b=h[dp[r-(1<<t)+1][t]];returna<b?a:b;
}
intlcp(inta,intb)
{a=rank[a];b=rank[b];intt;if(a>b){t=a;a=b;b=t;}returnaskRMQ(a+1,b);
}
intcalc(intn,intlen)
{inti,j;intret=0;for(i=0;i<=n;i++){if(h[i]>=len){intmin=sa[i-1],max=sa[i-1];for(j=i;j<=n&&h[j]>=len;j++){if(sa[j]>max)max=sa[j];if(sa[j]<min)min=sa[j];}if(max-min>=len)ret++;i=j-1;}}returnret;
}
intmain()
{inti;Log[0]=-1;for(i=1;i<MAX;i++)Log[i]=(i&(i-1))?Log[i-1]:Log[i-1]+1;intn=100005;while(scanf("%s",s)!=EOF){n=strlen(s);for(i=0;i<n;i++)r[i]=s[i];r[n]=0;make_suffix_arr(r,n,128);cal_height(n);//for(i=0;i<=n;i++)printf("%d\n",h[i]);intret=0;for(i=1;i*2<=n;i++){ret+=calc(n,i);}printf("%d\n",ret);}return0;
}/**//**************************************************************Problem: 1555User: 鬼MLanguage: C++Result: AcceptedTime:50 msMemory:1244 kb
****************************************************************/

题目1555:重复子串相关推荐

  1. [Jobdu] 题目1530:最长不重复子串

    题目描述: 最长不重复子串就是从一个字符串中找到一个连续子串,该子串中任何两个字符都不能相同,且该子串的长度是最大的. 输入: 输入包含多个测试用例,每组测试用例输入一行由小写英文字符a,b,c... ...

  2. 后缀数组求最长重复子串

    问题描述 给定一个字符串,求出其最长重复子串 例如:abcdabcd 最长重复子串是 abcd,最长重复子串可以重叠 例如:abcdabcda,这时最长重复子串是 abcda,中间的 a 是被重叠的. ...

  3. #1407 : 后缀数组二·重复旋律2 (不可重叠最长重复子串问题)

    题目链接 思路 求不可重叠最长重复子串,也可以利用height[i]height[i]height[i]. 二分枚举答案KKK 当height[i]≥Kheight[i] \ge Kheight[i] ...

  4. POJ 1743 (后缀数组+不重叠最长重复子串)

    题目链接: http://poj.org/problem?id=1743 题目大意:楼教主の男人八题orz.一篇钢琴谱,每个旋律的值都在1~88以内.琴谱的某段会变调,也就是说某段的数可以加减一个旋律 ...

  5. 牛客题霸 [最长重复子串] C++题解/答案

    牛客题霸 [最长重复子串] C++题解/答案 题目描述 一个重复字符串是由两个相同的字符串首尾拼接而成,例如abcabc便是长度为6的一个重复字符串,而abcba则不存在重复字符串. 给定一个字符串, ...

  6. 最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和...

    最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和 文章作者:Yx.Ac   文章来源:勇幸|Thinking (http://www.ahathi ...

  7. LeetCode 1062. 最长重复子串(二分查找)

    文章目录 1. 题目 2. 解题 1. 题目 给定字符串 S,找出最长重复子串的长度.如果不存在重复子串就返回 0. 示例 1: 输入:"abcd" 输出:0 解释:没有重复子串. ...

  8. LeetCode:Longest Substring Without Repeating Characters(最长不重复子串)

    题目链接 Given a string, find the length of the longest substring without repeating characters. For exam ...

  9. 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串 (转)...

    作者:寒小阳 时间:2013年9月. 出处:http://blog.csdn.net/han_xiaoyang/article/details/11969497. 声明:版权所有,转载请注明出处,谢谢 ...

  10. 动态规划之最长递增子序列 最长不重复子串 最长公共子序列

    [前言]动态规划:与分治法相似,即通过组合子问题来求解原问题,不同的是分治法是将问题划分为互不相交的子问题,递归求解子问题,再将他们组合起来求出原问题的解. 动态规划则应用于子问题重叠的情况,通常用来 ...

最新文章

  1. 解决存储过程中数据安全问题的四种方式
  2. oracle数据字典表与视图
  3. MongoDB基础教程系列--目录结构
  4. 通过多说服务器缓存加速Gravatar 头像
  5. windows下安装和设置gradle
  6. BZOJ 1662: [Usaco2006 Nov]Round Numbers 圆环数(数位DP+恶心细节)
  7. 服务器可以装2个系统吗,云服务器可以装多个系统吗
  8. 使用RDLC报表(四)--钻取式报表
  9. Python问题记录
  10. 【Java】java.util.Objects 工具类方法研究
  11. Symbian编程总结-基础篇-描述符(2)-TDesC8与TDesC16之间的互转
  12. 利用SAP 0day,四分钟内黑掉华尔街
  13. 前后端开发的心得体会_web前端学习心得体会
  14. 4199 公约数(求解约数 + 最大公约数 + 二分)
  15. 谁动了你的 MSN?—— MSN 帐号被盗原因的分析和解决办法,鄙视msnlivesn.com
  16. RK3066和AML8726-MX方案对比 频率与功耗 / 性能 / 方案成本
  17. 租车出行如何避免踩坑,区块链技术解决信任问题
  18. 转--Android 文件外/内部存储的获取各种存储目录路径
  19. FPGA - 7系列 FPGA内部结构之CLB -01- CLB资源概述
  20. 一、node.js的理解?优缺点?应用场景?

热门文章

  1. Java项目部署到云服务器最简单的方法
  2. php 正则 修饰符,php 正则修饰符
  3. 小猿圈python_小猿圈python之内置方法new
  4. python 连接数据库 慢_python自动结束mysql慢查询会话的实例代码
  5. python日志(Logger)的输出
  6. 计算机系统结构期末张晨曦,计算机系统结构(张晨曦)试题
  7. python curl invalid syntax_将CURL Post转换为Python请求失败
  8. linux入门、常用命令
  9. dos系统功能调用的屏幕显示字符是( )号调用_linux混杂设备驱动模型分析(字符设备驱动模型使用篇)...
  10. delphi 鼠标获取窗口句柄_pygame--创建一个简单的窗口