【黑客大赛】前缀真前缀

原创 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;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

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

举个例子,如字符串 ababc 首先,不考虑空字符,所有的前缀有a, ab, aba, abab, ababc,其中真前缀有a, ab, aba, abab 同理可以理解后缀,真前(后)缀就是指不...

各国家电话前缀 plist

  • 2017年09月19日 10:57
  • 25KB
  • 下载

Euler函数前缀

  • 2017年07月06日 20:38
  • 2.83MB
  • 下载

从性能角度看前缀++和后缀++(++i和i++的深入剖析)

从性能角度看前缀++和后缀++(++i和i++的深入剖析)     在初学

编译原理 活前缀 程序

  • 2012年06月18日 13:47
  • 6KB
  • 下载

一个算数表达式的前缀中缀和后缀(可进行负数运算)

一个算数表达式的前缀中缀和后缀目录一个算数表达式的前缀中缀和后缀 目录 关于前缀中缀和后缀 中缀转前缀后缀的算法思想 代码实现 1. 关于前缀、中缀和后缀 中缀表达式:就是我们常见的算数表达式,有优先...

VC++变量,范围前缀等命名规则

  • 2009年02月28日 21:36
  • 131KB
  • 下载

cuda 函数前缀:device/global/host 相关问题

在深度学习caffe框架等多处,用到了CUDA函数,使代码加速,其文件类型为XXX.cu。在运行这些CUDA函数时,会遇到一下C++里没有的问题,比如函数前缀问题,如果在修改编写.cu文件时不注意,会...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【黑客大赛】前缀真前缀
举报原因:
原因补充:

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