#pragma comment(linker, "/stack:20000000") #pragma GCC optimize("Ofast") #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native") #define _CRT_SECURE_NO_WARNINGS # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include using namespace std; // Let's define unordered map # ifdef __GNUC__ # if __cplusplus > 199711L # include # include # else # include # include using namespace tr1; # endif # else # include # include # endif #define VA_NUM_ARGS(...) VA_NUM_ARGS_IMPL_((0,__VA_ARGS__, 6,5,4,3,2,1)) #define VA_NUM_ARGS_IMPL_(tuple) VA_NUM_ARGS_IMPL tuple #define VA_NUM_ARGS_IMPL(_0,_1,_2,_3,_4,_5,_6,N,...) N #define macro_dispatcher(macro, ...) macro_dispatcher_(macro, VA_NUM_ARGS(__VA_ARGS__)) #define macro_dispatcher_(macro, nargs) macro_dispatcher__(macro, nargs) #define macro_dispatcher__(macro, nargs) macro_dispatcher___(macro, nargs) #define macro_dispatcher___(macro, nargs) macro ## nargs #define DBN1(a) cerr<<#a<<"="<<(a)<<"\n" #define DBN2(a,b) cerr<<#a<<"="<<(a)<<", "<<#b<<"="<<(b)<<"\n" #define DBN3(a,b,c) cerr<<#a<<"="<<(a)<<", "<<#b<<"="<<(b)<<", "<<#c<<"="<<(c)<<"\n" #define DBN4(a,b,c,d) cerr<<#a<<"="<<(a)<<", "<<#b<<"="<<(b)<<", "<<#c<<"="<<(c)<<", "<<#d<<"="<<(d)<<"\n" #define DBN5(a,b,c,d,e) cerr<<#a<<"="<<(a)<<", "<<#b<<"="<<(b)<<", "<<#c<<"="<<(c)<<", "<<#d<<"="<<(d)<<", "<<#e<<"="<<(e)<<"\n" #define DBN6(a,b,c,d,e,f) cerr<<#a<<"="<<(a)<<", "<<#b<<"="<<(b)<<", "<<#c<<"="<<(c)<<", "<<#d<<"="<<(d)<<", "<<#e<<"="<<(e)<<", "<<#f<<"="<<(f)<<"\n" #define DBN(...) macro_dispatcher(DBN, __VA_ARGS__)(__VA_ARGS__) #define DA(a,n) cerr<<#a<<"=["; printarray(a,n); cerr<<"]\n" #define DAR(a,n,s) cerr<<#a<<"["< pii; typedef pair pll; typedef vector vi; typedef vector vll; typedef int itn; template struct triple{ T1 a; T2 b; T3 c; triple() : a(T1()), b(T2()), c(T3()) {}; triple(T1 _a, T2 _b, T3 _c) :a(_a), b(_b), c(_c){} }; template bool operator<(const triple&t1,const triple&t2){if(t1.a!=t2.a)return t1.a bool operator>(const triple&t1,const triple&t2){if(t1.a!=t2.a)return t1.a>t2.a;else if(t1.b!=t2.b)return t1.b>t2.b;else return t1.c>t2.c;} #define tri triple #define trll triple #define FI(n) for(int i=0;i<(n);++i) #define FJ(n) for(int j=0;j<(n);++j) #define FK(n) for(int k=0;k<(n);++k) #define FL(n) for(int l=0;l<(n);++l) #define FQ(n) for(int q=0;q<(n);++q) #define FOR(i,a,b) for(int i = (a), __e = (int) (b); i < __e; ++i) #define all(a) std::begin(a), std::end(a) #define reunique(v) v.resize(std::unique(v.begin(), v.end()) - v.begin()) #define sqr(x) ((x) * (x)) #define sqrt(x) sqrt(1.0 * (x)) #define pow(x, n) pow(1.0 * (x), n) #define COMPARE(obj) [&](const std::decay_t& a, const std::decay_t& b) #define COMPARE_BY(obj, field) [&](const std::decay_t& a, const std::decay_t& b) { return a.field < b.field; } #define checkbit(n, b) (((n) >> (b)) & 1) #define setbit(n, b) ((n) | (static_cast>(1) << (b))) #define removebit(n, b) ((n) & ~(static_cast>(1) << (b))) #define flipbit(n, b) ((n) ^ (static_cast>(1) << (b))) inline int countBits(uint v){v=v-((v>>1)&0x55555555);v=(v&0x33333333)+((v>>2)&0x33333333);return((v+(v>>4)&0xF0F0F0F)*0x1010101)>>24;} inline int countBits(ull v){uint t=v>>32;uint p=(v & ((1ULL << 32) - 1)); return countBits(t) + countBits(p); } inline int countBits(ll v){return countBits((ull)v); } inline int countBits(int v){return countBits((uint)v); } unsigned int reverseBits(uint x){ x = (((x & 0xaaaaaaaa) >> 1) | ((x & 0x55555555) << 1)); x = (((x & 0xcccccccc) >> 2) | ((x & 0x33333333) << 2)); x = (((x & 0xf0f0f0f0) >> 4) | ((x & 0x0f0f0f0f) << 4)); x = (((x & 0xff00ff00) >> 8) | ((x & 0x00ff00ff) << 8)); return((x >> 16) | (x << 16)); } template inline int sign(T x){ return x > 0 ? 1 : x < 0 ? -1 : 0; } inline bool isPowerOfTwo(int x){ return (x != 0 && (x&(x - 1)) == 0); } constexpr ll power(ll x, int p) { return p == 0 ? 1 : x * power(x, p - 1); } template T1 inline clamp(T1 x, const T2& a, const T3& b) { if (x < a) return a; else if (x > b) return b; else return x; } unsigned long long rdtsc() { unsigned long long ret = 0; #ifdef __clang__ return __builtin_readcyclecounter(); #endif #ifndef _MSC_VER asm volatile("rdtsc" : "=A" (ret) : :); #endif return ret; } // Fast IO ******************************************************************************************************** const int __BS = 4096; static char __bur[__BS + 16], *__er = __bur + __BS, *__ir = __er; template T readInt() { auto c = [&]() { if (__ir == __er) std::fill(__bur, __bur + __BS, 0), cin.read(__bur, __BS), __ir = __bur; }; c(); while (*__ir && (*__ir < '0' || *__ir > '9') && *__ir != '-') ++__ir; c(); bool m = false; if (*__ir == '-') ++__ir, c(), m = true; T r = 0; while (*__ir >= '0' && *__ir <= '9') r = r * 10 + *__ir - '0', ++__ir, c(); ++__ir; return m ? -r : r; } static char __buw[__BS + 20], *__iw = __buw, *__ew = __buw + __BS; template void writeInt(T x, char endc = '\n') { if (x < 0) *__iw++ = '-', x = -x; if (x == 0) *__iw++ = '0'; char* s = __iw; while (x) { T t = x / 10; char c = x - 10 * t + '0'; *__iw++ = c; x = t; } char* f = __iw - 1; while (s < f) swap(*s, *f), ++s, --f; if (__iw > __ew) cout.write(__buw, __iw - __buw), __iw = __buw; *__iw++ = endc; } template void writeStr(const T& str) { int i = 0; while (str[i]) { *__iw++ = str[i++]; if (__iw > __ew) cout.write(__buw, __iw - __buw), __iw = __buw; } } struct __FL__ { ~__FL__() { if (__iw != __buw) cout.write(__buw, __iw - __buw); } }; static __FL__ __flushVar__; //STL output ***************************************************************************************************** #define TT1 template #define TT1T2 template #define TT1T2T3 template TT1T2 ostream& operator << (ostream& os, const pair& p); TT1 ostream& operator << (ostream& os, const vector& v); TT1T2 ostream& operator << (ostream& os, const set&v); TT1T2 ostream& operator << (ostream& os, const multiset&v); TT1T2 ostream& operator << (ostream& os, priority_queue v); TT1T2T3 ostream& operator << (ostream& os, const map& v); TT1T2T3 ostream& operator << (ostream& os, const multimap& v); TT1T2T3 ostream& operator << (ostream& os, const triple& t); template ostream& operator << (ostream& os, const array& v); TT1T2 ostream& operator << (ostream& os, const pair& p){ return os <<"("<& v){ bool f=1;os<<"[";for(auto& i : v) { if (!f)os << ", ";os< ostream& operator << (ostream& os, const array& v) { bool f=1;os<<"[";for(auto& i : v) { if (!f)os << ", ";os<&v){ bool f=1;os<<"[";for(auto& i : v) { if (!f)os << ", ";os<&v){bool f=1;os<<"[";for(auto& i : v) { if (!f)os << ", ";os<& v){ bool f = 1; os << "["; for (auto& ii : v) { if (!f)os << ", "; os << "(" << ii.first << " -> " << ii.second << ") "; f = 0; }return os << "]"; } TT1T2 ostream& operator << (ostream& os, const multimap& v){ bool f = 1; os << "["; for (auto& ii : v) { if (!f)os << ", "; os << "(" << ii.first << " -> " << ii.second << ") "; f = 0; }return os << "]"; } TT1T2 ostream& operator << (ostream& os, priority_queue v) { bool f = 1; os << "["; while (!v.empty()) { auto x = v.top(); v.pop(); if (!f) os << ", "; f = 0; os << x; } return os << "]"; } TT1T2T3 ostream& operator << (ostream& os, const triple& t){ return os << "(" << t.a << ", " << t.b << ", " << t.c << ")"; } TT1T2 void printarray(const T1& a, T2 sz, T2 beg = 0){ for (T2 i = beg; i> (istream& os, triple& t); TT1T2 inline istream& operator >> (istream& os, pair& p) { return os >> p.first >> p.second; } TT1 inline istream& operator >> (istream& os, vector& v) { if (v.size()) for (T& t : v) os >> t; else { string s; T obj; while (s.empty()) {getline(os, s); if (!os) return os;} stringstream ss(s); while (ss >> obj) v.push_back(obj); } return os; } TT1T2T3 inline istream& operator >> (istream& os, triple& t) { return os >> t.a >> t.b >> t.c; } //Pair magic ***************************************************************************************************** #define PT1T2 pair TT1T2 inline PT1T2 operator+(const PT1T2 &p1 , const PT1T2 &p2) { return PT1T2(p1.first + p2.first, p1.second + p2.second); } TT1T2 inline PT1T2& operator+=(PT1T2 &p1 , const PT1T2 &p2) { p1.first += p2.first, p1.second += p2.second; return p1; } TT1T2 inline PT1T2 operator-(const PT1T2 &p1 , const PT1T2 &p2) { return PT1T2(p1.first - p2.first, p1.second - p2.second); } TT1T2 inline PT1T2& operator-=(PT1T2 &p1 , const PT1T2 &p2) { p1.first -= p2.first, p1.second -= p2.second; return p1; } #undef TT1 #undef TT1T2 #undef TT1T2T3 #define FREIN(FILE) freopen(FILE, "rt", stdin) #define FREOUT(FILE) freopen(FILE, "wt", stdout) #ifdef LOCAL #define BEGIN_PROFILE(idx, name) int profileIdx = idx; profileName[profileIdx] = name; totalTime[profileIdx] -= rdtsc() / 1e3; #define END_PROFILE totalTime[profileIdx] += rdtsc() / 1e3; totalCount[profileIdx]++; #else #define BEGIN_PROFILE(idx, name) #define END_PROFILE #endif template inline void normmod(T &x, T m) { x %= m; if (x < 0) x += m; } template inline T2 summodfast(T1 x, T1 y, T2 m) { T2 res = x + y; if (res >= m) res -= m; return res; } template inline void addmodfast(T1 &x, T2 y, T3 m) { x += y; if (x >= m) x -= m; } template inline void submodfast(T1 &x, T2 y, T3 m) { x -= y; if (x < 0) x += m; } #if INTPTR_MAX == INT32_MAX or !defined(__SIZEOF_INT128__) inline ll mulmod(ll x, ll n, ll m){ ll r = 0; normmod(x, m); normmod(n, m); while (n) { if (n & 1) r += x; x += x; if (r >= m) r -= m; if (x >= m) x -= m; n /= 2; } return r; } #else using int128 = __int128; inline ll mulmod(ll x, ll n, ll m){ return __int128(x) * n % m; } #endif inline ll powmod(ll x, ll n, ll m){ ll r = 1; normmod(x, m); while (n){ if (n & 1)r = (r*x) % m; x = (x*x) % m; n /= 2; }return r; } inline ll powmulmod(ll x, ll n, ll m) { ll res = 1; normmod(x, m); while (n){ if (n & 1)res = mulmod(res, x, m); x = mulmod(x, x, m); n /= 2; } return res; } template inline T gcd(T a, T b) { while (b) { a %= b; T t = a; a = b; b = t; } return a; } inline ll lcm(ll a, ll b){ return a / gcd(a, b) * b; } template inline T gcd(T a, T b, T c){ return gcd(gcd(a, b), c); } ll gcdex(ll a, ll b, ll& x, ll& y) { if (!a) { x = 0; y = 1; return b; } ll y1; ll d = gcdex(b % a, a, y, y1); x = y1 - (b / a) * y; return d; } template bool isPrime(T x) { if (x <= 4 || x % 2 == 0 || x % 3 == 0) return x == 2 || x == 3; for (T i = 5; i * i <= x; i += 6) if (x % i == 0 || x % (i + 2) == 0) return 0; return 1; } bool millerRabin(long long n) { if (n <= 1000) return isPrime(n); long long s = n - 1; int t = 0; while (s % 2 == 0) s /= 2, ++t; for (int a : {2, 325, 9375, 28178, 450775, 9780504, 1795265022}) { if (!(a %= n)) return true; long long f = powmulmod(a, s, n); if (f == 1 || f == n - 1) continue; for (int i = 1; i < t; ++i) if ((f = mulmod(f, f, n)) == n - 1) goto nextp; return false; nextp:; } return true; } // Useful constants //int some_primes[7] = {24443, 100271, 1000003, 1000333, 5000321, 98765431, 1000000123}; #define T9 1000000000 #define T18 1000000000000000000LL #define INF 1011111111 #define LLINF 1000111000111000111LL #define mod 1000000007 #define EPS (double)1e-10 #define PI 3.14159265358979323846264 #define link asaxlajrewqwe #define rank wahayawehasdakw //************************************************************************************* int32_t solve(); int32_t main(int argc, char** argv) { ios_base::sync_with_stdio(0);cin.tie(0); #ifdef LOCAL // FREIN("input.txt"); // FREOUT("out.txt"); #endif return solve(); } int solve() { int n; cin >> n; string s; cin >> s; bool hd = 0; bool hl = 0; bool hu = 0; bool sp = 0; string f = "!@#$%^&*()-+"; set q; for (char c : f) { q.insert(c); } for (char c : s) { if (isupper(c)) { hu = true; } if (islower(c)) { hl = true; } if (isdigit(c)) { hd = true; } if (q.count(c)) { sp = true; } } int ans = 4 - hd - hl - hu - sp; ans = max(ans, 6 - (int)s.size()); cout << ans << endl; return 0; }