#include <bits/stdc++.h>   #pragma warning(disable : 4996)   using namespace std;   namespace Bigcat {   template <typename T>   inline void max_s(T& a, const T& b) {     a = max(a, b);   }   template <typename T>   inline void min_s(T& a, const T& b) {     a = min(a, b);   }   template <typename T>   void sort_v(T& x) {     sort(x.begin(), x.end());   }   template <typename T>   void erase_dup(T& x) {     x.erase(unique(x.begin(), x.end()), x.end());   }   template <typename T, typename V>   int pos_l(const T& x, const V& v) {     return lower_bound(x.begin(), x.end(), v) - x.begin();   }   template <typename T, typename V>   int pos_u(const T& x, const V& v) {     return upper_bound(x.begin(), x.end(), v) - x.begin();   }   inline unsigned rand_g() {     static mt19937 mt_rand((int)time(0));     return mt_rand();   }   using LL = long long;   using VI = vector<int>;   using VVI = vector<VI>;   using VL = vector<LL>;   using PII = pair<int, int>;   using VPII = vector<PII>;   }  // namespace Bigcat   using namespace Bigcat;   const LL base = LL(1e9 + 7);   const LL INFL = 1LL << 62;   const int INF = 1 << 30;   const int MAX = int(1e5 + 100);   struct Node {     int x, y, w;   };   bool operator<(const Node& n0, const Node& n1) { return n0.x < n1.y; }   LL le0[300], ri0[300], th[300];   string zs[MAX];   void solve1() {     LL result = 0;     int n;     cin >> n;     for (int i = 0; i < n; ++i) {       cin >> zs[i];     }     string s = zs[n - 1];     char c0 =    ;     LL g = 0;     for (auto x : s) {       if (x == c0)         g++;       else {         c0 = x;         result = max(result, g);         g = 1;       }     }     result = max(result, g);     char lastone;     auto work = [&]() {       int bb = n;       for (int tt = n - 1; tt >= 0; --tt) {         string s = zs[tt];         LL g = 0;         for (auto x : s) {           if (x == lastone)             g++;           else {             break;           }         }         if (g == s.size()) {           continue;         }         bb = tt + 1;         break;       }       auto func = [&](const string& s) {         LL t = 0, a = 0;         for (auto c : s) {           if (c == lastone) {             t++;             a = max(a, t);           } else {             t = 0;           }         }         return a;       };       LL mc = 0;       for (int i = 0; i < bb; ++i) {         string s = zs[i];         if (mc == 0) {           mc = func(s);           continue;         }         if (i != bb - 1) continue;         LL t = 1;         for (int i = 0; i < s.size(); ++i) {           if (s[i] != lastone) break;           t++;         }         for (int i = s.size() - 1; i >= 0; --i) {           if (s[i] != lastone) break;           t++;         }         mc = t;         mc = max(mc, func(s));       }       for (int i = bb; i < n; ++i) {         mc = (mc + 1) * zs[i].size() + mc;       }       result = max(result, mc);     };     lastone = zs[n - 1][0];     work();     lastone = zs[n - 1].back();     work();     cout << result << endl;   }   void solve() {     int t = 1;     for (int i = 0; i < t; ++i) {       solve1();     }     int x = 1;   }   void io_init() {     const int inId = 0;     const int outId = 0;     if (inId > 0) {       cerr <<  redirect stdin to input   << inId << endl;       string s =  input ;       s += to_string(inId);       s +=  .txt ;       auto r = freopen(s.c_str(),  r , stdin);       if (r == nullptr) {         cerr <<  invalid input file   << s << endl;         ;         r = freopen( CON ,  r , stdin);       }     }     if (outId > 0) {       cerr <<  redirect stdout to stdout   << outId << endl;       string s =  stdout ;       s += to_string(outId);       s +=  .txt ;       auto r = freopen(s.c_str(),  w , stdout);       if (r == nullptr) {         cerr <<  invalid output file   << s << endl;         ;         r = freopen( CON ,  w , stdout);       }     }   }   int main() {     ios_base::sync_with_stdio(0);     cin.tie(0);     cout.tie(0);     cout.precision(11);     solve();   }