#include <bits/stdc++.h>   inline int two(int n) { return 1 << n; }   inline int test(int n, int b) { return (n >> b) & 1; }   inline void set_bit(int& n, int b) { n |= two(b); }   inline void unset_bit(int& n, int b) { n &= ~two(b); }   inline int last_bit(int n) { return n & (-n); }   inline int ones(int n) {     int res = 0;     while (n && ++res) n -= n & (-n);     return res;   }   long long int gcd(long long int a, long long int b) {     return (a ? gcd(b % a, a) : b);   }   long long int modPow(long long int a, long long int b, long long int MOD) {     long long int x = 1, y = a;     while (b > 0) {       if (b % 2 == 1) {         x = (x * y) % MOD;       }       b /= 2;       y = (y * y) % MOD;     }     return x;   }   long long int modInverse(long long int a, long long int p) {     return modPow(a, p - 2, p);   }   using namespace std;   int A[26];   int marked[26];   bool check(int ex) {     int i, ctr;     ctr = 0;     for (i = 0; i < (26); i++) {       if (A[i] == ex) ctr++;     }     if (ctr == 1)       return true;     else       return false;   }   int main() {     int n, i, j, k;     cin >> n;     char ch;     int inf = -999999;     string str;     int ans, ex, f;     ans = ex = f = 0;     for (i = (1); i <= (n); i++) {       cin >> ch >> str;       int len = str.size();       if (f) {         if (i == n) continue;         if (ch ==  !  || ch ==  ? ) ans++;       }       if (ch ==  ! ) {         memset(marked, 0, sizeof(marked));         ex++;         for (j = 0; j < (len); j++) {           if (A[str[j] -  a ] != inf && !marked[str[j] -  a ]) A[str[j] -  a ]++;           marked[str[j] -  a ]++;         }       } else if (ch ==  . ) {         for (j = 0; j < (len); j++) A[str[j] -  a ] = inf;       } else         A[str[0] -  a ] = inf;       if (check(ex) && !f) f++;     }     cout << ans;   }   