HDU 3068 (Manacher) 최 장 회신
9697 단어 HDU
s2 [0] = '$' 는 순환 에서 배열 의 경 계 를 넘 는 검 사 를 피 하 는 것 입 니 다.
첫째 의 코드:
http://www.cnblogs.com/BigBallon/p/3816890.html
자세 한 도해:
http://blog.csdn.net/xingyeyongheng/article/details/9310555
틀 문 제 는 할 말 이 없다.Manacher 알고리즘 자 체 는 확실히 이해 하고 체득 해 야 합 니 다.
1 #define LOCAL
2 #include <iostream>
3 #include <cstdio>
4 #include <cstring>
5 #include <algorithm>
6 using namespace std;
7
8 const int maxn = 110000 + 20;
9 char s1[maxn], s2[maxn * 2];
10 int p[maxn * 2];
11
12 void init(char s1[], char s2[])
13 {
14 s2[0] = '$', s2[1] = '#';
15 int j = 2;
16 for(int i = 0; s1[i] != '\0'; ++i)
17 {
18 s2[j++] = s1[i];
19 s2[j++] = '#';
20 }
21 s2[j] = '\0';
22 }
23
24 void manacher(char s[])
25 {
26 int id, mx = 0;
27 p[0] = 0;
28 for(int i = 1; s[i] != '\0'; ++i)
29 {
30 if(mx > i)
31 p[i] = min(p[2*id-i], mx - i);
32 else
33 p[i] = 1;
34 while(s[i+p[i]] == s[i-p[i]])
35 ++p[i];
36 if(i + p[i] > mx)
37 {
38 mx = i + p[i];
39 id = i;
40 }
41 }
42 }
43
44 void getans(void)
45 {
46 int ans = 0;
47 for(int i = 1; s2[i] != '\0'; ++i)
48 ans = max(ans, p[i] - 1);
49 printf("%d
", ans);
50 }
51
52 int main(void)
53 {
54 #ifdef LOCAL
55 freopen("3068in.txt", "r", stdin);
56 #endif
57
58 while(scanf("%s", s1) != EOF)
59 {
60 init(s1, s2);
61 manacher(s2);
62 getans();
63 }
64 return 0;
65 }
부호 군
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[HDU] 4089 활성화 확률 DPdp[i][j]를 모두 i개인의 대기열인 Tomato가 j위 서버가 마비될 확률로 역추를 사용하면 우리는 상태 이동 방정식을 얻을 수 있다. i == 1 : dp[1][1] = dp[1][1] * p1 + dp[1]...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.