【HDOJ3068】最长回文(manacher)

题意:求一个由小写字母组成的字符串中的最长回文长度

cas<=120 n<=110000

思路:试manacher板子

 1 var a:array[0..300000]of char;
 2     p:array[0..300000]of longint;
 3     ch:ansistring;
 4     len,n,i,mx,id,ans:longint;
 5
 6 function min(x,y:longint):longint;
 7 begin
 8  if x<y then exit(x);
 9  exit(y);
10 end;
11
12 function max(x,y:longint):longint;
13 begin
14  if x>y then exit(x);
15  exit(y);
16 end;
17
18 begin
19  assign(input,‘hdoj3068.in‘); reset(input);
20  assign(output,‘hdoj3068.out‘); rewrite(output);
21  while not eof do
22  begin
23   readln(ch);
24   len:=length(ch);
25   if len=0 then continue;
26   n:=2; a[1]:=‘@‘; a[2]:=‘#‘;
27   for i:=1 to len do
28   begin
29    inc(n); a[n]:=ch[i];
30    inc(n); a[n]:=‘#‘;
31   end;
32   inc(n); a[n]:=‘$‘;
33   mx:=0; id:=0;
34   for i:=2 to n-1 do
35   begin
36    if mx>i then p[i]:=min(p[2*id-i],mx-i)
37     else p[i]:=1;
38    while a[i+p[i]]=a[i-p[i]] do inc(p[i]);
39    if p[i]+i>mx then
40    begin
41     mx:=p[i]+i;
42     id:=i;
43    end;
44   end;
45   ans:=1;
46   for i:=2 to n-1 do ans:=max(ans,p[i]-1);
47   writeln(ans);
48  end;
49  close(input);
50  close(output);
51 end.
时间: 2024-10-02 18:56:47

【HDOJ3068】最长回文(manacher)的相关文章

hdu 3068 最长回文(manacher&amp;最长回文子串)

最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7317    Accepted Submission(s): 2500 Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如aba, abba等 Input 输入有多组

HDU 3068 最长回文 (manacher算法)

最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 9188    Accepted Submission(s): 3159 Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如aba, abba等 Input 输入有多组

HDOJ3068最长回文

最长回文 解法1.manacher算法 #include <cstdio> #include <cstring> #include <string> using namespace std; char str[1000002 + 1200]; int fast(char *p) { int ans = 1; for (int i = 1; p[i]; ++i) { int s = i, e = i, t; while (p[e + 1] == p[i]) ++e; i

HDU 3068 最长回文(Manacher)

题目链接:[kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher 题意 给出一个只由小写英文字符a,b,c-y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如aba, abba等 思路 用特殊字符插入到s串中每两个字符中间,实现每个回文串都是奇数,再用manacher算法进行求解. 代码 #include <iostream> #include <algorithm> #include <cstring

[hdu3068 最长回文]Manacher算法,O(N)求最长回文子串

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068 题意:求一个字符串的最长回文子串 思路: 枚举子串的两个端点,根据回文串的定义来判断其是否是回文串并更新答案,复杂度O(N3). 枚举回文串的对称轴i,以及回文半径r,由i和r可确定一个子串,然后暴力判断即可.复杂度O(N2). 在上一步的基础上,改进判断子串是否是回文串的算法.记fi(r)=(bool)以i为对称轴半径为r的子串是回文串,fi(r)的值域为{0, 1},显然fi(r)是关于r

HDU 3068(最长回文-manacher)[Template:manacher]

最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 9660    Accepted Submission(s): 3353 Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如aba, abba等 Input 输入有多组

HDU3068 最长回文 MANACHER+回文串

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068 Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.回文就是正反读都是一样的字符串,如aba, abba等 Input 输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c...y,z组成的字符串S两组case之间由空行隔开(该空行不用处理)字符串长度len <= 110000 Output 每一行一

[hdu3068]最长回文(Manacher算法)

http://acm.hdu.edu.cn/showproblem.php?pid=3068 题目大意:求最长回文串的长度. 解题关键:Manacher算法 引用一个较好的解释 p[i] = mx > i ? min(p[2 * id - i], mx - i) : 1; 可以这么说,这行要是理解了,那么马拉车算法基本上就没啥问题了,那么这一行代码拆开来看就是 如果mx > i, 则 p[i] = min(p[2 * id - i], mx - i) 否则, p[i] = 1 当 mx - i

[HDOJ3068]最长回文

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068 最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 11870    Accepted Submission(s): 4351 Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,

hdu 3068 最长回文(manacher入门)

最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 11553    Accepted Submission(s): 4191 Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.回文就是正反读都是一样的字符串,如aba, abba等 Input 输入有多组c