#pragma comment(linker, "/STACK:102400000,102400000")
#include <vector>
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <bits/stdc++.h>
using namespace std;
const int M = (1 << 17);
const int mod = 1e9 + 7;
int n;
vector <int> arr;
namespace Manacher{
vector <int> arr, p;
int go(vector <int> &A){
int len = A.size();
p.resize(len * 2 + 3);
arr.resize(len * 2 + 3);
arr[0] = -2;
for(int i=1; i<=len*2; i+=2){
arr[i] = -1;
arr[i+1] = A[i/2];
}
arr[len*2+1] = -1;
arr[len*2+2] = -2;
len = len * 2 + 2;
int mx = 0, id = 0;
for(int i=1; i<len-1; i++){
if(mx > i)
p[i] = min(mx - i, p[2*id-i]);
else
p[i] = 1;
while(arr[i-p[i]] == arr[i+p[i]])
p[i]++;
if(mx < i + p[i]){
mx = i + p[i];
id = i;
}
}
vector <pair<int, int> > tmpArr;
for(int i=0; i<len-1; i++){
if(arr[i] != -1 || p[i] <= 1) continue;
tmpArr.push_back(make_pair(p[i], i));
}
sort(tmpArr.begin(), tmpArr.end(), greater <pair<int, int> >());
int res = 0;
set <int> S; S.clear();
set <int> :: iterator it1, it2;
vector <pair <int, int> > :: iterator it;
for(it = tmpArr.begin(); it < tmpArr.end(); it++){
int lim1 = (*it).second - ((*it).first - 1);//此回文串起点下标
it1 = S.lower_bound(lim1);
if(it1 != S.end() && lim1 <= (*it1) && (*it1) < (*it).second)
res = max(res, ((*it).second - (*it1)) / 2 * 3);
int lim2 = (*it).second + ((*it).first - 1);
it2 = S.upper_bound(lim2);
if(it2 != S.begin()) it2--;
if(it2 != S.end() && (*it2) > (*it).second && (*it2) <= lim2)
res = max(res, ((*it2)-(*it).second) / 2 * 3);
S.insert((*it).second);
//cout << (*it).second << endl;
}
return res;
}
}
int main(){
//freopen("in.txt", "r", stdin);
int cas, t = 0;
scanf("%d", &cas);
while(cas--){
scanf("%d", &n);
arr.resize(n);
for(int i=0; i<n; i++)
scanf("%d", &arr[i]);
printf("Case #%d: ", ++t);
printf("%d\n", Manacher::go(arr));
}
return 0;
}
#pragma comment(linker, "/STACK:102400000,102400000")
#include <vector>
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <bits/stdc++.h>
using namespace std;
const int M = (1 << 17);
const int mod = 1e9 + 7;
int n;
vector <int> arr;
namespace Manacher{
vector <int> arr, p;
int go(vector <int> &A){
int len = A.size();
p.resize(len * 2 + 3);
arr.resize(len * 2 + 3);
arr[0] = -2;
for(int i=1; i<=len*2; i+=2){
arr[i] = -1;
arr[i+1] = A[i/2];
}
arr[len*2+1] = -1;
arr[len*2+2] = -2;
len = len * 2 + 2;
int mx = 0, id = 0;
for(int i=1; i<len-1; i++){
if(mx > i)
p[i] = min(mx - i, p[2*id-i]);
else
p[i] = 1;
while(arr[i-p[i]] == arr[i+p[i]])
p[i]++;
if(mx < i + p[i]){
mx = i + p[i];
id = i;
}
}
vector <pair<int, int> > tmpArr;
for(int i=0; i<len-1; i++){
if(arr[i] != -1 || p[i] <= 1) continue;
tmpArr.push_back(make_pair(p[i], i));
}
sort(tmpArr.begin(), tmpArr.end(), greater <pair<int, int> >());
int res = 0;
set <int> S; S.clear();
for(auto & x : tmpArr){
int lim1 = x.second - (x.first - 1);//此回文串起点下标
auto it1 = S.lower_bound(lim1);
if(it1 != S.end() && lim1 <= (*it1) && (*it1) < x.second)
res = max(res, (x.second - (*it1)) / 2 * 3);
int lim2 = x.second + (x.first - 1);
auto it2 = S.upper_bound(lim2);
if(it2 != S.begin()) it2--;
if(it2 != S.end() && (*it2) > x.second && (*it2) <= lim2)
res = max(res, ((*it2)-x.second) / 2 * 3);
S.insert(x.second);
//cout << x.second << endl;
}
return res;
}
}
int main(){
//freopen("in.txt", "r", stdin);
int cas, t = 0;
scanf("%d", &cas);
while(cas--){
scanf("%d", &n);
arr.resize(n);
for(int i=0; i<n; i++)
scanf("%d", &arr[i]);
printf("Case #%d: ", ++t);
printf("%d\n", Manacher::go(arr));
}
return 0;
}