【黑客大赛】前缀真前缀

原创 2016年08月28日 18:34:48

(编程题)
对于两个字符串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 <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <numeric>
//#include <functional>
using namespace std;
bool mycompare(string str1,string str2)
{
return str1.size() > str2.size();
}
int main()
{
int chNum;/////字符串中的字符个数
while(cin>>chNum)
{
string str1;
char ch;//////每次输入的字符
for(int i = 0; i < chNum+2;i++)
{
cin>>ch;
str1 += ch;
}
//cout<<str1<<endl;//测试生成的string是对的
///////////得到str1的所有前缀和真前缀
//////得到正规的string "babababa"-------babababa
str1.erase(0,1);
str1.erase(str1.size()-1,1);
vector<string>strVecAllPrefix;
string strAllPrefix;
//string strTruePrefix;
for(int i = 0; i < str1.size();i++)
{
strAllPrefix += str1[i];
strVecAllPrefix.push_back(strAllPrefix);
//strVecTruePrefix.push_back(strAllPrefix);
}
vector<string>strVecTruePrefix(strVecAllPrefix.begin(),strVecAllPrefix.end()-1);
//strVecTruePrefix.erase(strVecTruePrefix.end()-1);
/////////存储前缀的最长重词的个数
vector<int>iVec;
///////////////////////找每一个前缀的多个重复词
for(int i = 0; i < strVecAllPrefix.size();i++)
{
string strTemp = strVecAllPrefix[i];/////临时字符串,存放每一个前缀的
string str2;//////临时字符串,存放每一个前缀的真前缀
vector<string>strVecRepeat;
for(int j = 0; j < strTemp.size()-1;j++)
{
str2 += strTemp[j];////每一个前缀的真前缀
//strVecRepeat.push_back(str2);
string str2str2 = str2+str2;
string str3;//////临时字符串,存放str2str2的前缀

for(int k = 0; k < str2str2.size();k++)
{
str3 += str2str2[k];
if(strTemp == str3)
{
strVecRepeat.push_back(str2);
//break;
}
}
}
if(!strVecRepeat.empty())
{
sort(strVecRepeat.begin(),strVecRepeat.end(),mycompare);
int len = strVecRepeat[0].size();
iVec.push_back(len);
}
else
{
iVec.push_back(0);
}
}
cout<<accumulate(iVec.begin(),iVec.end(),0)<<endl;
}
system("pause");
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

KMP求前缀函数(next数组)

前缀函数主要是求出模式串中的next数组,那么什么是模式串呢?模式串模式串的概念很简单。举个例子:“给出一个字符串 T,再给出 n 个字符串 S1、S2...Sn,问 S1、S2...Sn 中有哪些是...
  • The_star_is_at
  • The_star_is_at
  • 2017年03月28日 16:20
  • 245

字符串前缀,真前缀,后缀,真后缀,及前缀函数

举个例子,如字符串 ababc 首先,不考虑空字符,所有的前缀有a, ab, aba, abab, ababc,其中真前缀有a, ab, aba, abab 同理可以理解后缀,真前(后)缀就是指不...
  • u012384285
  • u012384285
  • 2014年05月17日 22:20
  • 3918

next数组的理解

// next.cpp : 定义控制台应用程序的入口点。 //KMP next数组 //前缀数组(next数组)表示字符串的最长匹配前后缀 //字符串开始到当前位置的子串 #inclu...
  • w823626691
  • w823626691
  • 2015年12月13日 19:40
  • 752

关于KMP算法中前缀函数(next函数)的一点个人理解

最近再刷笔试题的时候,发现了几道题需要求取字符串的next数组。 关于这部分知识,之前是有学过,代码也是比较简洁的,如下: public static int[] getNext(String ...
  • tumaolin94
  • tumaolin94
  • 2016年12月17日 23:56
  • 571

ACM水题--字符串的前缀和后缀

字符串的前缀和后缀 Time Limit:1000MS Memory Limit:65536K Total Submit:81 Accepted:22 Description ...
  • gzzheyi
  • gzzheyi
  • 2012年03月09日 17:15
  • 10215

浏览器内核及前缀

各浏览器渲染引擎: Chrome和safari用的是webkit引擎; Firefox用的是gecko引擎; IE用的是trident引擎; Opera用的是presto引擎,后改为webki...
  • u013494746
  • u013494746
  • 2014年10月12日 21:43
  • 3322

IPv6地址前缀

当我们通过ipv6 install 命令在windows XP系统上安装了ipv6协议栈后,我们可以看到原来的网卡多了一个新的地址-ipv6地址。 这个地址是基于ipv6无状态自动配置机制设定的。 ...
  • tjhon
  • tjhon
  • 2013年09月28日 10:36
  • 5558

【算法讲解】前缀函数(KMP的next函数)

这里的主要目的是理解KMP算法中next[]数组的含义和实现过程:前缀函数主要是求出模式串中的next数组,那么什么是模式串呢?模式串模式串的概念很简单。举个例子:“给出一个字符串 T,再给出 n 个...
  • u011747781
  • u011747781
  • 2014年02月17日 16:58
  • 1614

Laravel 数据库加密及数据库表前缀配置

报错问题:DecryptException in Encrypter.php line 148: The MAC is invalid. 如何运行 php artisan key:gener...
  • chunsezhilv
  • chunsezhilv
  • 2017年09月22日 14:29
  • 1126

最新邮箱匹配正则(邮箱前缀可包含"_")

/** * 校验邮箱格式 * * @param email * @return * @author shijing * 2015年11月10日下午6:17:59 */ p...
  • shijing266
  • shijing266
  • 2015年11月19日 15:03
  • 1632
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【黑客大赛】前缀真前缀
举报原因:
原因补充:

(最多只允许输入30个字)