最长回文字串--------注意一个小点-----添加字符的问题
来源:互联网 发布:神经网络算法入门书籍 编辑:程序博客网 时间:2024/05/02 00:48
在对奇数串和对偶数串统一处理添加新字符的时候,要用#1#2#1#
不然对于字符串abcca输出会出错
因为:
a#b#c#c#a
输出3
#a#b#c#c#a#
输出3
但是121
#1#2#1#
输出4
而1#2#1
输出3
所以还是#1#2#1#
这样最后结果都统一减一
错了好几次:
我的最后代码:(POJ3974)
#include<iostream>
#include<string>
using namespace std;
#define MAX 10000002
int max_right;//探索的最右位置
int c;//最右位置对应的下标
int p[MAX];//存放每个点对应的最长回文串
int max_r;
void solve(string s)//calculate result
{
for(int j=0;j<s.size();j++)
p[j]=1;
max_right=0;
c=0;
for(int i=0;i<s.size();i++)
{
int temp;
if(max_right>i)
{
if(c+c-i<s.size()&&p[c+c-i]>max_right-i+1)
p[i]=max_right-i+1;
else p[i]=p[c+c-i];
}
int k=p[i];
while((i-k)>=0&&(i+k)<s.size()&&s[i-k]==s[i+k])
{
p[i]++;
k++;
}
if(i+p[i]-1>max_right)
{
max_right=i+p[i]-1;
c=i;
}
if(p[i]>max_r)
{
max_r=p[i];
}
// cout<<p[i]<<endl;
}
}
string g(string ss)//预处理
{
string r;
for(int v=0;v<ss.size();v++)
{
r+='#';
r+=ss[v];
}
r+='#';
return r;
}
int main(void)
{
string temp;
int a=1;
int max_c;
while(cin>>temp)
{
if(temp=="END")
break;
max_r=0;
string temp2;
temp2=g(temp);
solve(temp2);//return result
cout<<"Case "<<a<<": "<<max_r-1<<endl;
a++;
}
return 0;
}
- 最长回文字串--------注意一个小点-----添加字符的问题
- 添加最少字符组成最长回文字串
- C 最长回文字串问题
- 字符串的最长回文字串
- 最长回文字串的提取
- 最长公共字串算法-构造回文问题
- 通过最长公共子串求得使得一个串变为回文串的最少添加字符
- 【最长回文字串】Calf Flac 最长的回文 (Usaco_Training 1.3)
- 求最长回文字串的长度
- Longest Palindromic Substring 最长的回文字串
- 算法的经典问题,求最长回文子串,最长重复字串
- 最长回文字串
- 求解最长回文字串
- 最长回文字串
- 最长回文字串
- 最长回文字串
- 最长回文字串
- 最长回文字串
- UVa 1432 Fire-Control System 解题报告(离散化 + 扫描)
- A记录,CNAME记录,NS记录简介
- 排序
- STL 源码剖析 算法 stl_algo.h -- binary_search
- HDUJ 1019 Least Common Multiple
- 最长回文字串--------注意一个小点-----添加字符的问题
- java面试题及答案(基础题122道,代码题19道)
- STL 源码剖析 算法 stl_algo.h -- next_permutation
- 太容易让他一人太诱人
- poj 1787(多重背包)
- 【BZOJ】【P1455】【罗马游戏】【题解】【斜堆】
- 有了无线网卡驱动,但总是安装不成功的解决办法
- 路由器端口映射
- Vs2013编译Boost asio时出现的错误