Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //https://codeforces.com/contest/1538/problem/E
- #include<bits/stdc++.h>
- using namespace std;
- #define forx(x1,y1) for( unsigned long long x1=0;x1<y1;++x1)
- #define INF 1e9
- #define all(x2) begin(x2),end(x2)
- using ll= double;
- using ull=unsigned long long;
- ull f(const string& s){
- if(s.size()<4)
- return 0;
- ull res=0;
- for(ull i=3;i<s.size();++i)
- if(s[i-1]=='h' && s[i-2]=='a' && s[i-3]=='h' && s[i]=='a')
- ++res;
- return res;
- }
- int main(){
- ios::sync_with_stdio(false);
- cin.tie();
- long long t;
- cin>>t;
- vector<ull>ot;
- while(t--){
- long long n;
- cin>>n;
- map<string,pair<pair<string,string>,ull>>m;
- while(n--){
- string s,u1,u2;
- cin>>s>>u1;
- if(u1==":="){
- cin>>u1;
- m[s]={{u1,"_"},f(u1)};
- }
- else {
- cin >> u1;
- cin >> u2;
- cin >> u2;
- auto p1 = m[u1];
- auto p2 = m[u2];
- if (p1.first.second == "_" && p2.first.second == "_") {
- if (p1.first.first.size() + p2.first.first.size() >= 6) {
- string s1, s2, sum;
- sum = p1.first.first + p2.first.first;
- for (long long i=0;i<3;++i)
- s1 += sum[i];
- for (long long i = sum.size() - 1; i >= sum.size() - 3; --i)
- s2 += sum[i];
- reverse(all(s2));
- m[s] = {{s1, s2}, f(sum)};
- }
- else
- m[s] = {{p1.first.first + p2.first.first, "_"}, f(p1.first.first + p2.first.first)};
- }
- else if (p1.first.second == "_") {
- string s1, s2;
- for (long long i = p1.first.first.size() - 1; i >= 0; --i) {
- s1 += p1.first.first[i];
- if (i == p1.first.first.size() - 3)
- break;
- }
- reverse(all(s1));
- s1 += p2.first.first;
- for (long long i = 0; i < p1.first.first.size(); ++i) {
- s2 += p1.first.first[i];
- if (s2.size() == 3)
- break;
- }
- for (long long i = 0; i < 3; ++i) {
- if (s2.size() == 3)
- break;
- s2 += p2.first.first[i];
- }
- m[s] = {{s2, p2.first.second}, f(p1.first.first) + p2.second + f(s1)};
- }
- else if (p2.first.second == "_") {
- string s1, s2;
- s1=p1.first.second;
- for (long long i = 0; i <p2.first.first.size(); ++i) {
- s1 += p2.first.first[i];
- if (i ==2)
- break;
- }
- for (long long i = p2.first.first.size()-1; i >= 0; --i) {
- s2 += p2.first.first[i];
- if (s2.size() == 3)
- break;
- }
- for (long long i = p1.first.second.size()-1; i >=0; --i) {
- if (s2.size() == 3)
- break;
- s2 += p1.first.second[i];
- }
- reverse(all(s2));
- m[s] = {{p1.first.first, s2}, f(p2.first.first) + p1.second + f(s1)};
- }
- else
- m[s]={{p1.first.first,p2.first.second},p1.second+p2.second+f(p1.first.second+p2.first.first)};
- }
- if(n==0){
- ot.emplace_back(m[s].second);
- }
- }
- }
- for(auto& i:ot)
- cout<<i<<'\n';
- }
Add Comment
Please, Sign In to add comment