#include #include #include using namespace std ; const int CACHESIZE = 2*2*2*9*9*9 ; int keychars, kcord[256], cache[CACHESIZE] ; int getkey(int aa, int bb, int cc, int ab, int bc, int ca) { return aa + 2 * (bb + 2 * (cc + 2 * (ab + 4 + 9 * (bc + 4 + 9 * (ca + 4))))) ; } int sgn(int v) { if (v < 0) return -1 ; if (v > 0) return 1 ; return 0 ; } int eval(int aa, int bb, int cc, int ab, int bc, int ca) { aa &= 1 ; bb &= 1 ; cc &= 1 ; int lowt = min(min(abs(ab), abs(bc)), abs(ca)) ; if (lowt > 3) { lowt = (lowt - 2) & ~1 ; ab = sgn(ab) * (abs(ab)-lowt) ; bc = sgn(bc) * (abs(bc)-lowt) ; ca = sgn(ca) * (abs(ca)-lowt) ; } int cap = 1 + min(min(abs(ab), abs(bc)), abs(ca)) ; ab = sgn(ab) * min(abs(ab), cap) ; bc = sgn(bc) * min(abs(bc), cap) ; ca = sgn(ca) * min(abs(ca), cap) ; int k = getkey(aa, bb, cc, ab, bc, ca) ; if (cache[k]) return cache[k] - 1 ; int r = (aa > 0 && eval(aa-1, bb, cc, ab, bc, ca) == 0) || (ab > 0 && eval(bb, cc, aa, bc, ca, ab-1) == 0) || (ca < 0 && eval(cc, aa, bb, ca+1, ab, bc) == 0) ; cache[k] = 1 + r ; return r ; } int cnts[3][3] ; int main() { int n ; cin >> n ; vector vocab(n) ; for (auto &v: vocab) { cin >> v ; keychars |= 1<<(v[0]-'a') ; keychars |= 1<<(v[v.size()-1]-'a') ; } int nkc = 0 ; for (int i=0; i<26; i++) if ((keychars >> i) & 1) kcord[i+'a'] = nkc++ ; for (auto &v: vocab) cnts[kcord[(int)v[0]]][kcord[(int)v[v.size()-1]]]++ ; int r = 0 ; for (auto &v: vocab) { int sc = kcord[(int)v[v.size()-1]] ; int sc2 = (sc + 1) % 3 ; int sc3 = (sc + 2) % 3 ; cnts[kcord[(int)v[0]]][sc]-- ; if (eval(cnts[sc][sc], cnts[sc2][sc2], cnts[sc3][sc3], cnts[sc][sc2]-cnts[sc2][sc], cnts[sc2][sc3]-cnts[sc3][sc2], cnts[sc3][sc]-cnts[sc][sc3]) == 0) r++ ; cnts[kcord[(int)v[0]]][sc]++ ; } cout << r << endl ; }