POJ 3974

    题意:求一个字符串的最长回文子串,限时15s ORZ,大概只有O(NlogN)的后缀数组的和O(N)的Manacher可以吧。这个算法刚巧看到就找来这题AC了。我觉得写的还蛮清楚的,代码如下。

#include
#include
#include
#define M 10000005
using namespace std;
string s,tmp;
int casen,ans,rad[M];
int main()
{
	while(cin>>tmp){
		if("END"==tmp) break;
		cout<<"Case "<<++casen<<": ";
		int n=tmp.size();
		s="";
		memset(rad,0,sizeof(rad));
		for(int i=0;i=0 && i+j


Manacher算法:最长回文子串,O(N)

       这个是根据zlh神的博文http://www.starvae.com/?p=212#comment-1401 写的,看的资料下来这个是最容易理解这个DP的,神牛博客里的代码貌似是针对回文子串长度是偶数的情况写的,在实际情况中我们为了统一子串长度奇偶性,可以用在字符间添加分隔符的方法,使情况全部转化为长度是奇数的情况。例如"abc"添加分隔符后变成"#a#b#c#",然后略微修改的代码见上。有写的不对的地方请路过的大牛提醒
       模版神马的,有预处理看起来长一些,其实很简单的10行。

int manacher(string tmp)                                                           //tmp是原始串
{
		int n=tmp.size(),ans=0;;
		string s;
		memset(rad,0,sizeof(rad));
		for(int i=0;i=0 && i+j


你可能感兴趣的:(DP,字符串,学习笔记,stdstring,ini,string,算法,扩展)