题目来源:密码截取_牛客题霸_牛客网
描述
Catcher是MCA国的情报员,他工作时发现敌国会用一些对称的密码进行通信,比如像这些ABBA,ABA,A,123321,但是他们有时会在开始或结束时加入一些无关的字符以防止别国破解。比如进行下列变化 ABBA->12ABBA,ABA->ABAKK,123321->51233214 。因为截获的串太长了,而且存在多种可能的情况(abaaab可看作是aba,或baaab的加密形式),Cathcer的工作量实在是太大了,他只能向电脑高手求助,你能帮Catcher找出最长的有效密码串吗?
数据范围:字符串长度满足 1 \le n \le 2500 \1≤n≤2500
输入描述:
输入一个字符串(字符串的长度不超过2500)
输出描述:
返回有效密码串的最大长度
示例1
输入:ABBA
输出:4
示例2
输入:ABBBA
输出:5
示例3
输入:12HHHHA
复制输出:4
我的代码:
最长回文,采用马拉车算法:C++马拉车(Manacher)算法_ixRic的博客-CSDN博客_c++马拉车
#include<iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
string str;
cin>>str;
//马拉车算法
string code="$#";
for(int i=0;i<str.length();i++){
code+=str[i];
code+="#";
}
code+="@";//防止越界
int right=0,pos=0;
vector<int> dp(code.length(),-1);//全部初始化为0
for(int i=1;i<code.length();i++){
if(i<right){
dp[i]=min(dp[2*pos-i],right-i);
}
else{//如果当前位置超过了最长子序列的右边界
right=i;//右边界
dp[i]=1;
}
while(code[i+dp[i]]==code[i-dp[i]]){
dp[i]++;
}
if(right<i+dp[i]){
right=i+dp[i];
pos = i;
}
}
int res=0;
for(int i=0;i<dp.size();i++){
res = max(res, dp[i]);
}
cout<<res-1;
return 0;
}