func_code_string: #include <bits/stdc++.h>   using namespace std;   char F1[2000000];   char F2[2000000];   void computeLPSArray(string pat, int M, int* lps);   void KMPSearch(string pat, string txt, vector<int>& st, vector<int>& end) {     int M = pat.size();     int N = txt.size();     int lps[M];     computeLPSArray(pat, M, lps);     int i = 0;     int j = 0;     while (i < N) {       if (pat[j] == txt[i]) {         j++;         i++;       }       if (j == M) {         end.push_back(i - 1);         st.push_back(i - M);         j = lps[j - 1];       } else if (i < N && pat[j] != txt[i]) {         if (j != 0)           j = lps[j - 1];         else           i = i + 1;       }     }   }   void computeLPSArray(string pat, int M, int* lps) {     int len = 0;     lps[0] = 0;     int i = 1;     while (i < M) {       if (pat[i] == pat[len]) {         len++;         lps[i] = len;         i++;       } else {         if (len != 0) {           len = lps[len - 1];         } else {           lps[i] = 0;           i++;         }       }     }   }   long long int Stoi(string s) {     long long int ans = 0;     for (int i = 0; i < s.size(); i++) ans = ans * 10 + s[i] -  0 ;     return ans;   }   string itos(long long int num) {     if (num == 0) return  0 ;     string ans =   ;     while (num) {       int digit = num % 10;       char ch =  0  + digit;       ans = ch + ans;       num = num / 10;     }     return ans;   }   long long int numBefore(int i, string& s) {     int indx = i - 1;     while (s[indx] >=  0  && s[indx] <=  9  && indx >= 0) indx--;     indx++;     int len = i - indx;     long long int num = Stoi(s.substr(indx, len));     return num;   }   int charAfter(int i, string& s) {     if (i == s.size() - 1) return -1;     int indx = i + 1;     while (s[indx] >=  0  && s[indx] <=  9  && indx >= 0) indx++;     return indx;   }   int main() {     int m, n;     cin >> n >> m;     long long int prevFreq = 0;     char prevCh =  Q ;     string Final =   ;     int ptr1 = 0, ptr2 = 0;     for (int i = 0; i < n; i++) {       string s;       cin >> s;       int size = s.size();       int indx = size - 2;       ;       string num1 = s.substr(0, indx);       long long int frq = Stoi(num1);       char Chr = s[indx + 1];       if (Chr == prevCh)         prevFreq += frq;       else {         if (prevCh !=  Q ) {           string s1 = itos(prevFreq) + prevCh;           for (int i = 0; i < s1.size(); i++) {             F1[ptr1] = s1[i];             ptr1++;           }         }         prevFreq = frq;         prevCh = Chr;       }     }     string s1 = itos(prevFreq) + prevCh;     for (int i = 0; i < s1.size(); i++) {       F1[ptr1] = s1[i];       ptr1++;     }     F1[ptr1] = 0;     Final = F1;     prevFreq = 0;     prevCh =  Q ;     string Final2 =   ;     for (int i = 0; i < m; i++) {       string s;       cin >> s;       int indx = s.find( - );       string num1 = s.substr(0, indx);       long long int frq = Stoi(num1);       char Chr = s[indx + 1];       if (Chr == prevCh)         prevFreq += frq;       else {         if (prevCh !=  Q ) {           string s2 = itos(prevFreq) + prevCh;           for (int i = 0; i < s2.size(); i++) {             F2[ptr2] = s2[i];             ptr2++;           }         }         prevFreq = frq;         prevCh = Chr;       }     }     string s2 = itos(prevFreq) + prevCh;     for (int i = 0; i < s2.size(); i++) {       F2[ptr2] = s2[i];       ptr2++;     }     Final2 = F2;     vector<int> st, end;     int indx = 0;     int indx2 = Final2.size() - 2;     while (Final2[indx] >=  0  && Final2[indx] <=  9 ) indx++;     while (indx2 >= 0 && Final2[indx2] >=  0  && Final2[indx2] <=  9 ) indx2--;     long long int ans = 0;     if (indx2 >= 0) {       string toSrch = Final2.substr(indx, indx2 - indx + 1);       KMPSearch(toSrch, Final, st, end);       for (int i = 0; i < st.size(); i++) {         long long int Aval = numBefore(st[i], Final);         long long int Req = numBefore(indx, Final2);         int i2 = charAfter(end[i], Final);         int i3 = charAfter(indx2, Final2);         if (i2 >= 0 && i3 >= 0 && Final2[i3] == Final[i2]) {           long long int Aval2 = numBefore(i2, Final);           long long int Req2 = numBefore(i3, Final2);           if (Aval >= Req && Aval2 >= Req2) ans++;         }       }     } else {       char ch = Final2[Final2.size() - 1];       for (int i = 0; i < Final.size(); i++) {         if (Final[i] == ch) {           long long int Aval = numBefore(i, Final);           long long int Req = numBefore(Final2.size() - 1, Final2);           if (Aval >= Req) ans = ans + (Aval - Req + 1);         }       }     }     cout << ans << endl;   }   