Cod sursa(job #2450370)

Utilizator ejoi2019Ejoi 2019 ejoi2019 Data 22 august 2019 23:20:59
Problema Diametrul unui arbore Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 4.2 kb
#include <bits/stdc++.h>

using namespace std;


typedef long long ll;
typedef long double ld;

const int mod=(int)1e9+7;

int add(int a,int b)
{
        a+=b;
        if(a>=mod)
                return a-mod;
        if(a<0)
                return a+mod;
        return a;
}

int mul(int a,int b)
{
        return a*(ll)b%mod;
}

int expow(int a,int b)
{
        int r=1;
        while(b)
        {
                if(b&1)
                        r=mul(r,a);
                a=mul(a,a);
                b/=2;
        }
        return r;
}

/**const int mod1=(int)1e9+7;
const int mod2=(int)1e9+9;

struct num
{
        int a;
        int b;
};

num add(num f,num s)
{
        f.a+=s.a;
        f.b+=s.b;

        if(f.a<0) f.a+=mod1;
        if(f.a>=mod1) f.a-=mod1;

        if(f.b<0) f.b+=mod2;
        if(f.b>=mod2) f.b-=mod2;
        return f;
}

num mul(num f,num s)
{
        return {f.a*(ll)s.a%mod1,f.b*(ll)s.b%mod2};
}

num expow(num a,int b)
{
        num r={1,1};
        while(b)
        {
                if(b&1)
                        r=mul(r,a);
                a=mul(a,a);
                b/=2;
        }
        return r;
}**/

mt19937 rng(228);
vector <int> test;

const int N=(int)4e5+7;
const int K=20;
int anc[N][K];
int n;
int val[N];
int suf[N];
int dep[N];
int pw[N];

int get(int i,int k)
{
        for(int j=0;(1<<j)<=k;j++)
                if(k&(1<<j))
                        i=anc[i][j];
        return i;
}

int hsh[N];
map <int,vector <int>> u;

int main()
{
        ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
        freopen("input","r",stdin);

        pw[0]=1;
        for(int i=1;i<N;i++)
                pw[i]=mul(pw[i-1],26);

        test.push_back((int)4e5);
        while(test.back()>=1)
                test.push_back(rng()%test.back());
        set <int> all;
        for(auto &x : test)
                all.insert(x);
      ///  for(int i=1;i<=30;i++) all.insert(i);
        test.clear();
        for(auto &x : all)
                test.push_back(x);

        cin>>n;
        for(int i=1;i<=n;i++)
        {
                int t;
                cin>>t;
                if(t==1)
                {
                        string s;
                        cin>>s;
                        val[i]=s[0]-'a';
                }
                else
                {
                        cin>>anc[i][0];
                        dep[i]=dep[anc[i][0]]+1;
                        string s;
                        cin>>s;
                        val[i]=s[0]-'a';
                }
                int adun=mul(val[i],pw[dep[i]]);
                suf[i]=add(suf[anc[i][0]],adun);
                for(int k=1;(1<<k)<=n;k++)
                        anc[i][k]=anc[anc[i][k-1]][k-1];
                int pos=0;
                for(auto &jump : all)
                {
                        int j=get(i,jump);
                        int x=val[j];
                        int adun=mul(x,pw[pos]);
                        hsh[i]=add(hsh[i],adun);
                        pos++;
                }
                u[hsh[i]].push_back(i);
        }
        int m;
        cin>>m;
        for(int i=1;i<=m;i++)
        {
                string t;
                cin>>t;
                int last=(int)t.size()-1;

                int cur=0;
                int pos=0;
                for(auto &jump : all)
                {
                        int j=last-jump;
                        int x;
                        if(j<0)
                                x=0;
                        else
                                x=t[j]-'a';
                        int adun=mul(x,pw[pos]);
                        cur=add(cur,adun);
                        pos++;
                }
                int complet=0;
                for(int i=0;i<(int)t.size();i++)
                {
                        int adun=0;
                        complet=add(complet,adun);
                }
                cout<<(int)u[cur].size()<<"\n";
                int ans=0;
                for(auto &it : u[cur])
                {

                }
        }

        return 0;
}