Mephistopheles_

Funny substrings (Cf)

Jun 30th, 2021 (edited)
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.98 KB | None | 0 0
  1. //https://codeforces.com/contest/1538/problem/E
  2.  
  3.  
  4.  
  5. #include<bits/stdc++.h>
  6. using namespace std;
  7. #define forx(x1,y1) for( unsigned long long x1=0;x1<y1;++x1)
  8. #define INF 1e9
  9. #define all(x2) begin(x2),end(x2)
  10. using ll= double;
  11. using ull=unsigned long long;
  12. ull f(const string& s){
  13.     if(s.size()<4)
  14.         return 0;
  15.     ull res=0;
  16.     for(ull i=3;i<s.size();++i)
  17.         if(s[i-1]=='h' && s[i-2]=='a' && s[i-3]=='h' && s[i]=='a')
  18.             ++res;
  19.     return res;
  20. }
  21. int main(){
  22.     ios::sync_with_stdio(false);
  23.     cin.tie();
  24.     long long t;
  25.     cin>>t;
  26.     vector<ull>ot;
  27.     while(t--){
  28.         long long n;
  29.         cin>>n;
  30.         map<string,pair<pair<string,string>,ull>>m;
  31.         while(n--){
  32.             string s,u1,u2;
  33.             cin>>s>>u1;
  34.             if(u1==":="){
  35.                 cin>>u1;
  36.                 m[s]={{u1,"_"},f(u1)};
  37.             }
  38.             else {
  39.                 cin >> u1;
  40.                 cin >> u2;
  41.                 cin >> u2;
  42.                 auto p1 = m[u1];
  43.                 auto p2 = m[u2];
  44.                 if (p1.first.second == "_" && p2.first.second == "_") {
  45.                     if (p1.first.first.size() + p2.first.first.size() >= 6) {
  46.                         string s1, s2, sum;
  47.                         sum = p1.first.first + p2.first.first;
  48.                         for (long long i=0;i<3;++i)
  49.                             s1 += sum[i];
  50.                         for (long long i = sum.size() - 1; i >= sum.size() - 3; --i)
  51.                             s2 += sum[i];
  52.                         reverse(all(s2));
  53.                         m[s] = {{s1, s2}, f(sum)};
  54.                     }
  55.                     else
  56.                         m[s] = {{p1.first.first + p2.first.first, "_"}, f(p1.first.first + p2.first.first)};
  57.                 }
  58.                 else if (p1.first.second == "_") {
  59.                     string s1, s2;
  60.                     for (long long i = p1.first.first.size() - 1; i >= 0; --i) {
  61.                         s1 += p1.first.first[i];
  62.                         if (i == p1.first.first.size() - 3)
  63.                             break;
  64.                     }
  65.                     reverse(all(s1));
  66.                     s1 += p2.first.first;
  67.                     for (long long i = 0; i < p1.first.first.size(); ++i) {
  68.                         s2 += p1.first.first[i];
  69.                         if (s2.size() == 3)
  70.                             break;
  71.                     }
  72.                     for (long long i = 0; i < 3; ++i) {
  73.                         if (s2.size() == 3)
  74.                             break;
  75.                         s2 += p2.first.first[i];
  76.                     }
  77.                     m[s] = {{s2, p2.first.second}, f(p1.first.first) + p2.second + f(s1)};
  78.                 }
  79.                 else if (p2.first.second == "_") {
  80.                     string s1, s2;
  81.                     s1=p1.first.second;
  82.                     for (long long i = 0; i <p2.first.first.size(); ++i) {
  83.                         s1 += p2.first.first[i];
  84.                         if (i ==2)
  85.                             break;
  86.                     }
  87.                     for (long long i = p2.first.first.size()-1; i >= 0; --i) {
  88.                         s2 += p2.first.first[i];
  89.                         if (s2.size() == 3)
  90.                             break;
  91.                     }
  92.                     for (long long i = p1.first.second.size()-1; i >=0; --i) {
  93.                         if (s2.size() == 3)
  94.                             break;
  95.                         s2 += p1.first.second[i];
  96.                     }
  97.                     reverse(all(s2));
  98.                     m[s] = {{p1.first.first, s2}, f(p2.first.first) + p1.second + f(s1)};
  99.  
  100.                 }
  101.                 else
  102.                     m[s]={{p1.first.first,p2.first.second},p1.second+p2.second+f(p1.first.second+p2.first.first)};
  103.             }
  104.             if(n==0){
  105.                 ot.emplace_back(m[s].second);
  106.             }
  107.         }
  108.  
  109.     }
  110.     for(auto& i:ot)
  111.         cout<<i<<'\n';
  112. }
Add Comment
Please, Sign In to add comment