牛客笔试题---求最长重复词长度之和
2016-01-16 23:29
232 查看
①题目要求:
对于两个字符串B和C,我们定义BC为将C接在B的后面形成的新串。一个字符串P是串A的前缀,当且仅当存在B使得A=PB,当然B可以为空串。若P!=A,则我们称P为A的真前缀。现在定义重复词。串Q是串A的重复词当且仅当Q是A的真前缀,且A是QQ的前缀。而A的最长重复词则是A的重复词中最长的一个,或者空串(当A没有任何重复串时)。如ababab的最长重复词是abab;abc的最长重复词是空串。
给定一个串s(由字母组成),及它的长度n(1≤n≤100000),请返回s的所有前缀的最长重复词的长度之和(空串长度为0)。
测试样例:
测试:
输出:
24
8
24
0
请按任意键继续. . .
对于两个字符串B和C,我们定义BC为将C接在B的后面形成的新串。一个字符串P是串A的前缀,当且仅当存在B使得A=PB,当然B可以为空串。若P!=A,则我们称P为A的真前缀。现在定义重复词。串Q是串A的重复词当且仅当Q是A的真前缀,且A是QQ的前缀。而A的最长重复词则是A的重复词中最长的一个,或者空串(当A没有任何重复串时)。如ababab的最长重复词是abab;abc的最长重复词是空串。
给定一个串s(由字母组成),及它的长度n(1≤n≤100000),请返回s的所有前缀的最长重复词的长度之和(空串长度为0)。
测试样例:
8,"babababa"
返回:24 实现:
#include<string> class Periods { public: long long getLongest(int n, string s) { // write code here long long res = 0; //1求所有前缀 for (int i = 0; i <= n; i++) { string subS = s.substr(0, i); //前缀 bool get = false; //是否获得最长重复词 //判断是否是重复词。//要求之一是qq 有前缀A所以长度限制 for (int k = i-1; k >= i / 2; k--) { //真前缀 i-1 保证 string subsubS = subS.substr(0, k); //前缀 string supS = subsubS + subsubS; string tmp = supS.substr(0, subS.length()); if (subS == tmp) { get = true; cout << subS << ":::::" << "\t"; cout << subsubS << endl; res += subsubS.length(); } else if (get == true)break; } } return res; } };
测试:
void main() { Periods per; string s1 = "babababa"; cout << per.getLongest(8, s1) << endl; s1 = "baaaba"; cout << per.getLongest(6, s1) << endl; s1 = "babababaa"; cout << per.getLongest(9, s1) << endl; s1 = ""; cout << per.getLongest(0, s1) << endl; }
输出:
24
8
24
0
请按任意键继续. . .
相关文章推荐
- 集合运算
- HTML5绘图基础_03_绘制连续线条
- 简单工厂模式
- mysql创建用户
- 友斯考特·杨(Scott Young)看我怎么驾驭MIT计算机科学的课程
- 静态顺序表常见各个接口的实现
- 简单的进度条实现
- Linux下配置Tomcat服务器
- [转]中英文停止词表(stopword)
- IIS6升级到 IIS 7AJax出错问题 设置 ajax.dll web.config 配置
- windows运维脚本:通过vbscript更新excel文档oracle数据源
- 算法作业代码
- Codeforces 609C Load Balancing
- 推荐!手把手教你使用Git
- jetbrains idea 15 "破解"
- DES加密解密
- Zookeeper 节点管理 Java实现
- 蓝桥杯之基础练习 回文数
- 浙江大学软件学院三维动画与交互技术考试概念整理
- HTML5绘图基础_02_绘制线条