HDU 3294 (Manacher) Girls' research

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

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

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

轻松1A,嘿嘿

 

 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 }
代码君

 

你可能感兴趣的:(search)