我的世界做圆网站,hhvm wordpress 空白,以美食为主的网站栏目怎么做,html与wordpress一、manacher()算法
1.可以在o(n)的时间内求出一个字符串的最长回文串
假设n1.1*10^7
N3e7n*2
2.原理 manacher算法
可以在o(n)的时间内求出一个字符串的最长回文串
1.改造字符串#xff0c;在字符之间和串两端插入#,
都变成奇回文串
s[0]$是哨兵#xff08;边界1.1*10^7
N3e7n*2
2.原理
manacher算法
可以在o(n)的时间内求出一个字符串的最长回文串
1.改造字符串在字符之间和串两端插入#,
都变成奇回文串
s[0]$是哨兵边界
string str,s;
cins;
lens.size();
str$;
for(i0;ilen;i)
{str#;strs[i];
}
str#;
lenstr.size();
coutmanacher()endl;
2.回文半径d[i]:以i为中心的最长回文串的长度的一半
# a # a # [b] # a #
1 2 3 2 1 4 1 2 1
3 1 右端点处在边缘位置
7/214
3.加速盒子[l,r];
维护右端点最靠右的最长回文串
利用盒子借助之前的状态来加速计算
新的状态。盒内d[i]可以利用对称点d值
转移盒外暴力计算完前i-1个d函数维护盒子[l,r];
1.如果ir(在盒内) i的对称点 r-il;
if(d[r-il]r-i1)//r-i偏移量 l偏移量对称点 d[i]d[i-l1];
elseir d[i]r-i1;
2.如果ir在盒外从i开始枚举
3.求出d[i]
if(id[i]-1r)li-d[i]1;rid[i]-1;void get_d(char *s,int n)
{d[1]1;for(i2,l,r1;in;i){if(ir)d[i]min(d[r-i1],r-i1);while(s[i-d[i]]s[id[i]])d[i];if(id[i]-1r){li-d[i]1;rid[i]-1;}}
}
二、例题
对给定的字符串本题要求你输出最长对称子串的长度。例如给定Is PATTAP symmetric?最长对称子串为s PATTAP s于是你应该输出11。
输入格式
输入在一行中给出长度不超过1000的非空字符串。
输出格式
在一行中输出最长对称子串的长度。
输入样例
Is PATTAP symmetric?输出样例
11
三、代码
#includeiostream
#includealgorithm
#includestring.h
#includecmath
using namespace std;
const int N2e7;
string str,s;
int p[N];
int n,len;
int manacher()
{p[0]0;int L0,R0,sum0,i;for(i1;ilen;i){if(iR)p[i]1;elsep[i]min(p[2*L-i],R-i);while(str[i-p[i]]str[ip[i]])p[i];if(ip[i]R){Li;Rip[i];summax(sum,p[i]);}}return sum-1;
}
int main()
{getline(cin,s);lens.size();int k0;//str[k];str;for(int i0;ilen;i){
// str[k]#;
// str[k]s[i];str#;strs[i];}str#; //str[k]#;lenstr.size();coutmanacher()endl;return 0;
}