| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
鄙人的代码虽然恶心,但是久久不能找到不对的数据... 寝食难安In Reply To:和暴力程序对拍了近200M的数据都无误,还是WA什么情况.... Posted by:michaelalan at 2013-03-06 15:19:55 #include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 1100100;
char A[maxn];
int ex_west[maxn] = {0};
int ex_east[maxn] = {0};
int P[maxn];
char L[maxn >> 1], R[maxn >> 1];
char rev_L[maxn >> 1], rev_R[maxn >> 1];
int cnt_max_len = 0;
void ex_preprocess(char* B, int* P, int m = -1)
{
int a = 0, p, L;
if (m == -1)
m = strlen(B);
P[0] = m;
while (a + 1 < m && B[a] == B[a + 1])
a++;
P[1] = a;
a = 1;
for (int k = 2; k < m; k++)
{
p = a + P[a] - 1;
L = P[k - a];
if (k + L - 1 >= p)
{
int j = (p - k + 1) > 0 ? (p - k + 1) : 0;
while (k + j < m && B[j] == B[k + j])
j++;
P[k] = j;
a = k;
}
else
P[k] = L;
}
}
void ex_kmp(char* A, char* B, int* P, int* EX, int n = -1, int m = -1)
{
int a = 0, p, L;
if (n == -1)
n = strlen(A);
if (m == -1)
m = strlen(B);
while (a < m && B[a] == A[a])
a++;
EX[0] = a;
a = 0;
for (int k = 1; k < n; k++)
{
p = a + EX[a] - 1;
L = P[k - a];
if (k + L - 1 >= p)
{
int j = (p - k + 1) > 0 ? (p - k + 1) : 0;
while (k + j < n && B[j] == A[k + j])
j++;
EX[k] = j;
a = k;
}
else
EX[k] = L;
}
}
void string_rev(char* S, char* rev_S, int n = -1)
{
if (n == -1)
n = strlen(S);
for (int i = 0; i < n; i++)
rev_S[n - i - 1] = S[i];
rev_S[n] = '\0';
}
int is_valid(char* S, int n = -1)
{
if (n == -1)
n = strlen(S);
int mid = n >> 1;
for (int i = 0; i < mid; i++)
{
if (S[i] != S[n - i - 1])
return 0;
}
return 1;
}
void int_array_rev(int* A, int n)
{
int mid = n >> 1;
for (int i = 0; i < mid; i++)
{
int tmp = A[i];
A[i] = A[n - i - 1];
A[n - i - 1] = tmp;
}
}
int solve(int l, int r)
{
if (l > r)
return 0;
if (l == r)
return 1;
if (r - l + 1 <= cnt_max_len)
return 1;
int mid = (l + r) >> 1;
int len = r - l + 1;
int L_len = mid - l + 1;
int R_len = len - L_len;
int ret = 1;
int cnt = 1;
while (mid - cnt >= l)
{
if (A[mid - cnt] == A[mid])
cnt++;
else
break;
}
ret += cnt - 1;
int l_pos = mid - (cnt - 1);
cnt = 1;
while (mid + cnt <= r)
{
if (A[mid + cnt] == A[mid])
cnt++;
else
break;
}
ret += cnt - 1;
int r_pos = mid + (cnt - 1);
cnt = 1;
while (l_pos - cnt >= l && r_pos + cnt <= r)
{
if (A[l_pos - cnt] == A[r_pos + cnt])
cnt++;
else
break;
}
ret += (cnt - 1) << 1;
memcpy(L, A + l, sizeof(char) * L_len);
L[L_len] = '\0';
string_rev(L, rev_L, L_len);
memcpy(R, A + mid + 1, sizeof(char) * R_len);
R[R_len] = '\0';
string_rev(R, rev_R, R_len);
for (int i = 0; i < len; i++)
P[i] = ex_west[i] = ex_east[i] = 0;
ex_preprocess(rev_L, P, L_len);
ex_kmp(L, rev_L, P, ex_east, L_len, L_len);
for (int i = 0; i < len; i++)
P[i] = 0;
ex_preprocess(R, P, R_len);
ex_kmp(rev_L, R, P, ex_west, L_len, R_len);
int_array_rev(ex_west, L_len);
for (int k = l + 1; k <= mid; k++)
{
int len = 0;
if ((ex_east[k] << 1) >= mid - k + 1)
{
int x = ex_east[k];
len = (k - 1 >= l ? (ex_west[k - l - 1] << 1) : 0) + mid - k + 1;
}
ret = ret > len ? ret : len;
}
for (int i = 0; i < len; i++)
P[i] = ex_west[i] = ex_east[i] = 0;
ex_preprocess(rev_L, P, L_len);
ex_kmp(R, rev_L, P, ex_east, R_len, L_len);
for (int i = 0; i < len; i++)
P[i] = 0;
ex_preprocess(R, P, R_len);
ex_kmp(rev_R, R, P, ex_west, R_len, R_len);
int_array_rev(ex_west, R_len);
mid++;
for (int k = mid; k <= r; k++)
{
int len = 0;
if ((ex_west[k - mid] << 1) >= k - mid + 1)
{
int x = ex_west[k - mid];
len = (k + 1 <= r ? (ex_east[k - mid + 1] << 1) : 0) + k - mid + 1;
}
ret = ret > len ? ret : len;
}
int L_ret = solve(l, mid - 1);
int R_ret = solve(mid, r);
ret = ret > L_ret ? ret : L_ret;
ret = ret > R_ret ? ret : R_ret;
cnt_max_len = cnt_max_len > ret ? cnt_max_len : ret;
return ret;
}
int main()
{
int cases = 1;
while (scanf("%s", A) > 0 && strcmp(A, "END"))
{
int n = strlen(A);
cnt_max_len = 1;
printf("Case %d: ", cases++);
if (is_valid(A, n))
printf("%d\n", n);
else
printf("%d\n", solve(0, n - 1));
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator