Cod sursa(job #2291185)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 27 noiembrie 2018 19:00:02
Problema A+B Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.78 kb
#include <bits/stdc++.h>

using namespace std;

const int N=120000+5;

int n;

map<string,int>id;
map<int,string>reco;
int CUR=0;

inline void add(string s)
{
    if(id[s]==0)
    {
        CUR++;
        id[s]=CUR;
        reco[CUR]=s;
    }
}

vector<int>what[N];
int egal[N];

inline void read_rec(int p)
{
    string s;
    cin>>s;
    while(cin>>s)
    {
        add(s);
        what[p].push_back(id[s]);
        cin>>s;
        if(s==")")
        {
            cin>>s;
            break;
        }
    }
    cin>>s;
    add(s);
    egal[p]=id[s];
}

int st[N];

int p;

inline int expresie();
inline int termen();

inline int termen()
{
    int val;
    if(st[p]==0)
    {
        int in=p;
        p++;
        val=expresie();
        p++;
       /// cout<<"\t\t\t\t\t\t\t\t\t\t\t\tLOL "<<in<<" , "<<val<<"\n";
       /// exit(0);
        return val;
    }
    else
    {
        val=st[p];
        p++;
       /// cout<<"\t\t\t\t\t\t\t\t\t\t\t\tLOL "<<p-1<<" , "<<val<<"\n";
        return val;
    }
}

int vf;

inline int expresie()
{
    int init=p;
   /// cout<<p<<"\n";
    vector<int>lol;
    lol.push_back(termen());
    if(init==1)
    {
        ///cout<<"LOL"<<lol.back()<<"\n";
    }
  ///  cout<<init<<" "<<p<<"\n";
        ///if(init==1)
        ///{
     ///       cout<<init<<"\t{"<<p<<" "<<vf<<"}\n";
        ///}
    while(st[p]==-2)
    {

        p++;
        int val=termen();
        lol.push_back(val);
    }
    sort(lol.begin(),lol.end());
    cout<<init<<"\t\t\t < = > ";
    for(auto &it:lol)
    {
        cout<<it<<" ";
    }
    if(lol.size()==1)
    {
        cout<<" = "<<" , "<<lol[0]<<"\n";
        return lol[0];
    }
    for(int i=1;i<=n;i++)
    {
        if(lol==what[i])
        {

            cout<<" = "<<" , "<<egal[i]<<"\n";
            return egal[i];
        }
    }
   /// cout<<"\n"<<init<<"\tERROR\n";
}

inline void slove_rec()
{
   /// cout<<"\n\n\n\n\n\n\n\n\n\n\n";
   /// cout<<"\n\n\n\n\n\n\n\n\n\n\n";
    cout<<"\n\n\n\n\n\n\n\n\n\n\nTC\n";
    vf=0;
    int top=0;
    while(1)
    {
        string s;
        cin>>s;
        if(s=="+")
        {
            st[++vf]=-2;
        }
        if(s=="(")
        {
            top++;
            st[++vf]=0;
        }
        if(s==")")
        {
            top--;
            if(top==0)
            {
                break;
            }
            st[++vf]=-1;
        }
        if(s!="(" && s!=")" && s!="+")
        {
            st[++vf]=id[s];
        }
    }
    p=1;
    for(int i=1;i<=vf;i++)
    {
        if(st[i]==0)
        {
            cout<<"( ";
        }
        if(st[i]==-1)
        {
            cout<<") ";
        }
        if(st[i]==-2)
        {
            cout<<"+ ";
        }
        if(st[i]>0)
        {
            cout<<st[i]<<" ";
        }
    }
    cout<<"\n";
    int val=expresie();
    cout<<val<<" "<<reco[val]<<"\n";
}

/// 0  = (
/// -1 = )
/// -2 = +

int main()
{
    freopen("input","r",stdin);
    freopen("output","w",stdout);
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        read_rec(i);
        sort(what[i].begin(),what[i].end());
    }
    int q;
    cin>>q;
    while(q--)
    {
        slove_rec();
    }
    ///return 0;
    cout<<"\n\n\n\n\n\n";
    cout<<"After Program\n\n\n";
    for(int i=1;i<=n;i++)
    {
        cout<<egal[i]<<"\t";
        for(auto &it:what[i])
        {
            cout<<it<<" ";
        }
        cout<<"\n";
    }
    cout<<"After Program\n\n\n";
    for(int i=1;i<=n;i++)
    {
        cout<<reco[egal[i]]<<"\t";
        for(auto &it:what[i])
        {
            cout<<reco[it]<<" ";
        }
        cout<<"\n";
    }
    return 0;
}
/**
**/