func_code_string: #include <bits/stdc++.h>   const int MAXN = 2e5 + 10;   const double eps = 1e-8;   const int mod1 = 1e9 + 7;   const int mod2 = 1e9 + 9;   using namespace std;   struct edge {     int t, v;     edge *next;   } e[MAXN << 1], *h[MAXN], *o = e;   void add(int x, int y, int vul) {     o->t = y;     o->v = vul;     o->next = h[x];     h[x] = o++;   }   long long read() {     long long x = 0, f = 1;     char ch = getchar();     while (!isdigit(ch)) {       if (ch ==  - ) f = -1;       ch = getchar();     }     while (isdigit(ch)) x = x * 10 + ch -  0 , ch = getchar();     return x * f;   }   typedef struct node {     char ch;     long long num;   } node;   node d1[MAXN], d2[MAXN];   long long sum1[MAXN], sum2[MAXN];   long long ksm(long long a, long long b, long long c) {     long long ans = 1;     while (b) {       if (b & 1) ans = ans * a % c;       a = a * a % c;       b = b >> 1;     }     return ans;   }   void Hash(int len) {     for (int i = 1; i <= len; i++) {       sum1[i] = (sum1[i - 1] * 131 % mod1 +                  ksm(ksm(131, d1[i].num, mod1), d1[i].ch, mod1)) %                 mod1;       sum2[i] = (sum2[i - 1] * 233 % mod2 +                  ksm(ksm(233, d1[i].num, mod2), d1[i].ch, mod2)) %                 mod2;     }   }   int main() {     int n = read(), m = read();     int cnt1 = 0, cnt2 = 0;     for (int i = 1; i <= n; i++) {       int t;       char ch;       scanf( %d-%c , &t, &ch);       if (i == 1 || ch != d1[cnt1].ch)         d1[++cnt1] = (node){ch, t};       else         d1[cnt1].num += t;     }     for (int i = 1; i <= m; i++) {       int t;       char ch;       scanf( %d-%c , &t, &ch);       if (i == 1 || ch != d2[cnt2].ch)         d2[++cnt2] = (node){ch, t};       else         d2[cnt2].num += t;     }     Hash(cnt1);     long long base1 = 0, base2 = 0;     for (int i = 2; i <= cnt2 - 1; i++) {       base1 =           (base1 * 131 % mod1 + ksm(ksm(131, d2[i].num, mod1), d2[i].ch, mod1)) %           mod1;       base2 =           (base2 * 233 % mod2 + ksm(ksm(233, d2[i].num, mod2), d2[i].ch, mod2)) %           mod2;     }     long long ans = 0;     for (int i = 1; i <= cnt1; i++) {       if (i + cnt2 - 1 > n) break;       if (d1[i].ch == d2[1].ch && d1[i].num >= d2[1].num) {         if (cnt2 == 1) {           ans += d1[i].num - d2[1].num + 1;           continue;         }         if (cnt2 == 2) {           if (d1[i + 1].ch == d2[2].ch && d1[i + 1].num >= d2[2].num) {             ans++;           }           continue;         }         int t1 = i + 1;         int t2 = i + cnt2 - 2;         long long tt1 =             (sum1[t2] - sum1[t1 - 1] * ksm(131, t2 - i, mod1) % mod1 + mod1) %             mod1;         long long tt2 =             (sum2[t2] - sum2[t1 - 1] * ksm(233, t2 - i, mod2) % mod2 + mod2) %             mod2;         if (tt1 != base1 || tt2 != base2) continue;         if (d1[i + cnt2 - 1].ch == d2[cnt2].ch &&             d1[i + cnt2 - 1].num >= d2[cnt2].num)           ans++;       }     }     printf( %lld n , ans);   }   