Manacher-模版题poj3974 hdu3068


当i>mx时,就要重头开始匹配啦

其余看代码的注释好好理解啊

//Manacher模版题poj3974
#include
#include
#include
#include
#include
using namespace std;
#define maxn 2001000

int g[maxn];char ss[maxn],s[maxn];
//ss为原串,s是ss相邻字符间加一个奇怪字符的串
//g[i]表示以字符s[i]为中心的最长回文长度
int mymax(int x,int y){return (x>y)?x:y;}
int mymin(int x,int y){return (xi) g[i]=mymin(g[2*p-i],mx-i);
			//当mx>i时,2*p-i是i关于p的对称点,它的g值是已经算好了的,
			//如果i+g[2*p-i]还在mx的范围里,那么g[i]=g[2*p-i]
			//否则就是说,目前可以确定的匹配好的长度为mx-i,从mx-i开始匹配
			else g[i]=1;//不然就从头开始匹配
			while (i+g[i]<=len && s[i-g[i]]==s[i+g[i]]) g[i]++;//匹配ing
			if (i+g[i]>mx) {mx=i+g[i];p=i;}//更新mx,p
			ans=mymax(ans,g[i]);
		}printf("Case %d: %d\n",++Case,ans-1);//g[i]中的最大值-1即为原串的最长回文子串长度
	}return 0;
}


转载于:https://www.cnblogs.com/Euryale-Rose/p/6527892.html

你可能感兴趣的:(Manacher-模版题poj3974 hdu3068)