码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 3294 (Manacher) Girls' research

时间:2014-08-18 20:25:42      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   os   io   for   ar   

变形的求最大回文子串,要求输出两个端点。

我觉得把‘b‘定义为真正的‘a‘是件很无聊的事,因为这并不会影响到最大回文子串的长度和位置,只是在输出的时候设置了一些不必要的障碍。

另外要注意一下原字符串s1中的字符在预处理以后的字符串s2中对应的坐标关系,这样输出的时候就可以照着这个关系转化。

轻松1A,嘿嘿

 

bubuko.com,布布扣
 1 //#define LOCAL
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <cstring>
 5 using namespace std;
 6 
 7 const int maxn = 200000 + 20;
 8 char s1[maxn], s2[maxn * 2], real;
 9 int p[maxn * 2];
10 
11 void init(char s1[], char s2[])
12 {
13     int j = 2;
14     s2[0] = $, s2[1] = #;
15     for(int i = 0; s1[i] != \0; ++i)
16     {
17         s2[j++] = s1[i];
18         s2[j++] = #;
19     }
20     s2[j] = \0;
21 }
22 
23 void manacher(char s[])
24 {
25     p[0] = 0;
26     int id, mx = 0;
27     for(int i = 1; s[i] != \0; ++i)
28     {
29         if(mx > i)
30             p[i] = min(p[id*2-i], mx-i);
31         else
32             p[i] = 1;
33         while(s[i + p[i]] == s[i - p[i]])
34             ++p[i];
35         if(i + p[i] > mx)
36         {
37             id = i;
38             mx = i + p[i];
39         }
40     }
41 }
42 
43 char change(char c)
44 {
45     c -= real - a;
46     if(c < a)    c += 26;
47     if(c > z)    c -= 26;
48     return c;
49 }
50 
51 void getans(void)
52 {
53     int mlen = 1, pos;
54     for(int i = 1; s2[i] != \0; ++i)
55     {
56         if(p[i] - 1 > mlen)
57         {
58             mlen = p[i] - 1;
59             pos = i;
60         }
61     }
62     if(mlen == 1)
63         printf("No solution!\n");
64     else
65     {
66         int L = (pos - (p[pos] - 2)) / 2 - 1;
67         int R = (pos + (p[pos] - 2)) / 2 - 1;
68         printf("%d %d\n", L, R);
69         for(int i = L; i <= R; ++i)
70             printf("%c", change(s1[i]));
71         printf("\n");
72     }
73 }
74 
75 int main(void)
76 {
77     #ifdef LOCAL
78         freopen("3294in.txt", "r", stdin);
79     #endif
80 
81     
82     while(scanf("%c", &real) == 1)
83     {
84         scanf("%s", s1);
85         getchar();
86         init(s1, s2);
87         manacher(s2);
88         getans();
89     }
90     return 0;
91 }
代码君

 

HDU 3294 (Manacher) Girls' research,布布扣,bubuko.com

HDU 3294 (Manacher) Girls' research

标签:style   blog   http   color   os   io   for   ar   

原文地址:http://www.cnblogs.com/AOQNRMGYXLMV/p/3920317.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!