zoukankan      html  css  js  c++  java
  • 模拟_模拟makefile文件(HDU_4724)

     这题坑爹,说好的五百组呢?

    There are at most 500 target in the Makefile. !!!!!

    If You Know This,You Must Have NO GF

    http://acm.hdu.edu.cn/showproblem.php?pid=4724

    #pragma warning(disable : 4786)
    #include <iostream>
    #include <string>
    #include <set>
    #include <map>
    using namespace std;
    
    typedef string String;
    #define M 5050
    
    map<String,int> Com;
    set<String> haveFile;
    set<String> fileLink[M];
    int addI,re_n;
    
    void clear()
    {
        Com.clear();
        haveFile.clear();
        for(int i=0; i<M; i++)
        {
            fileLink[i].clear();
        }
        addI = 0;
    }
    
    void catString(String &s1)
    {
        String s2;
        if(s1[s1.length() - 1] == '\')
        {
            s1[s1.length() - 1] = ' ';
            while(getline(cin,s2))
            {
                s1 += s2;
                if(s1[s1.length() - 1] == '\')
                {
                    s1[s1.length() - 1] = ' ';
                }
                else
                {
                    break;
                }
            }
        }
    }
    
    void eraseString(String &s1)    //erase #~
    {
        int finded = s1.find('#',0);
        if(finded != String::npos)
        {
            s1.erase(finded,s1.length() - finded);
        }
    }
    
    void addCom(String s1)
    {
    //    cout << "addCom: |" << s1 << "|" << endl;
        String s2;
        bool flag = true;
        for(int i=0; i<s1.length(); i++)
        {
            if(s1[i] == ' ' || i == s1.length() - 1)
            {
                if(i == s1.length() - 1 && s1[i] != ' ')
                {
                    s2 += s1[i];
                }
                if(s2 != "")
                {
                    if(flag)
                    {
                        flag = false;
                        s2.erase(s2.length() - 1);
                        Com.insert(pair<String,int>(s2,addI));
                    }
                    else
                    {
                        fileLink[addI].insert(s2);
                    }
    //                cout << "s2:|" << s2 << "|" << endl;
                }
                s2 = "";
            }
            else
            {
                s2 += s1[i];
            }
        }
        addI++;
    }
    
    void addFile(String s1)
    {
        int finded = s1.find(' ',0);
        if(finded != String::npos)
        {
            s1.erase(finded,s1.length() - finded);
        }
        haveFile.insert(s1);
    //    cout << "addFile: |" << s1 << "|" << endl;
    }
    
    bool findRun(String s1)
    {
    //    cout << "findRun:" << s1 << endl;
    
        if(re_n == -1)    return false;
        if(haveFile.find(s1) != haveFile.end())
            return true;
        if(Com.find(s1) == Com.end())
            return false;
        set<String> t = fileLink[Com[s1]];
        for(set<String>::iterator i = t.begin(); i != t.end(); i++)
        {
            if(findRun(*i) == false)
            {
                re_n = -1;
                return false;
            }
        }
        re_n++;
        haveFile.insert(s1);
        return true;
    }
    
    void run(String s1)
    {
        String s2;
    //    cout << "run: " << s1 << "|" << endl;
        for(int i=0; i<s1.length(); i++)
        {
            if(s1[i] == ' ' || i == s1.length() - 1)
            {
                if(i == s1.length() - 1 && s1[i] != ' ')
                {
                    s2 += s1[i];
                }
                if(s2 != "")
                {
                    if(s2 != "make")
                    {
    //                    cout << "s2:|" << s2 << "|" << endl;
                        findRun(s2);
                    }
                }
                s2 = "";
            }
            else
            {
                s2 += s1[i];
            }
        }
    }
    
    int main(int argc, char* argv[])
    {
    #ifdef __MYLOCAL
        freopen("in.txt","r",stdin);
    #endif
        
        int t;
        cin >> t;
        
        String s1;
        for(int i=1; i<=t; i++)
        {
            clear();
            int n;
            getchar();
            while(getline(cin,s1))
            {
                if(s1 == "====")
                    break;
                catString(s1);
                eraseString(s1);
                if(s1.find("g++",0) == String::npos)
                    addCom(s1);
    //            cout << "comd: " << s1 <<endl;
            }
            cin >> n;
            getchar();
            while(n--)
            {
                getline(cin,s1);
                catString(s1);
                eraseString(s1);
                addFile(s1);
    //            cout << "file: " << s1 <<endl;
            }
            cin >> n;
            getchar();
            cout << "Case #" << i << ":" << endl;
            while(n--)
            {
                re_n = 0;
                getline(cin,s1);
                catString(s1);
                eraseString(s1);
                run(s1);
                if(re_n == -1)
                    re_n++;
                cout << re_n << endl;
    //            cout << "run: " << s1 <<endl;
            }
            if(i != t) cout << endl;
        }
        
        return 0;
    }

     以下不受案例数限制,但效率低一点

    #pragma warning(disable : 4786)
    #include <iostream>
    #include <string>
    #include <vector>
    #include <set>
    #include <map>
    using namespace std;
    
    typedef string String;
    
    map<String,vector<String> > command;
    set<String> haveFile;
    int re_n;
    
    void clear()
    {
        for(map<String,vector<String> >::iterator iter = command.begin(); iter != command.end(); iter++)
        {
            iter->second.clear();
        }
        command.clear();
        haveFile.clear();
    }
    
    void catString(String &s1)
    {
        String s2;
        if(s1[s1.length() - 1] == '\')
        {
            s1[s1.length() - 1] = ' ';
            while(getline(cin,s2))
            {
                s1 += s2;
                if(s1[s1.length() - 1] == '\')
                {
                    s1[s1.length() - 1] = ' ';
                }
                else
                {
                    break;
                }
            }
        }
    }
    
    void eraseString(String &s1)
    {
        int finded = s1.find('#',0);
        if(finded != String::npos)
        {
            s1.erase(finded,s1.length() - finded);
        }
    }
    
    void addCommand(String s1)
    {
        String s2,commandName;
        vector<String> fileLink;
        bool flag = true;
        for(int i=0; i<s1.length(); i++)
        {
            if(s1[i] == ' ' || i == s1.length() - 1)
            {
                if(i == s1.length() - 1 && s1[i] != ' ')
                {
                    s2 += s1[i];
                }
                if(s2 != "")
                {
                    if(flag)
                    {
                        flag = false;
                        s2.erase(s2.length() - 1);
                        commandName = s2;
                    }
                    else
                    {
                        fileLink.push_back(s2);
                    }
                }
                s2 = "";
            }
            else
            {
                s2 += s1[i];
            }
        }
        command.insert(pair<String,vector<String> >(commandName,fileLink));
    }
    
    void addFile(String s1)
    {
        int finded = s1.find(' ',0);
        if(finded != String::npos)
        {
            s1.erase(finded,s1.length() - finded);
        }
        haveFile.insert(s1);
    }
    
    bool findRun(String s1)
    {
        if(re_n == -1)    return false;
        if(haveFile.find(s1) != haveFile.end())
            return true;
        if(command.find(s1) == command.end())
            return false;
        vector<String> t = command.find(s1)->second;
        for(vector<String>::iterator i = t.begin(); i != t.end(); i++)
        {
            if(findRun(*i) == false)
            {
                re_n = -1;
                return false;
            }
        }
        re_n++;
        haveFile.insert(s1);
        return true;
    }
    
    void run(String s1)
    {
        String s2;
        for(int i=0; i<s1.length(); i++)
        {
            if(s1[i] == ' ' || i == s1.length() - 1)
            {
                if(i == s1.length() - 1 && s1[i] != ' ')
                {
                    s2 += s1[i];
                }
                if(s2 != "")
                {
                    if(s2 != "make")
                    {
                        findRun(s2);
                    }
                }
                s2 = "";
            }
            else
            {
                s2 += s1[i];
            }
        }
    }
    
    int main(int argc, char* argv[]) 
    {
    #ifdef __MYLOCAL
        freopen("in.txt","r",stdin);
    #endif
        
        int t;
        cin >> t;
        
        String s1;
        for(int i=1; i<=t; i++)
        {
            clear();
            int n;
            getchar();
            while(getline(cin,s1))
            {
                if(s1 == "====")
                    break;
                catString(s1);
                eraseString(s1);
                if(s1.find("g++",0) == String::npos)
                    addCommand(s1);
            }
            cin >> n;
            getchar();
            while(n--)
            {
                getline(cin,s1);
                catString(s1);
                eraseString(s1);
                addFile(s1);
            }
            cin >> n;
            getchar();
            cout << "Case #" << i << ":" << endl;
            while(n--)
            {
                re_n = 0;
                getline(cin,s1);
                catString(s1);
                eraseString(s1);
                run(s1);
                if(re_n == -1)
                    re_n++;
                cout << re_n << endl;
            }
            if(i != t) cout << endl;
        }
        
        return 0;
    }
  • 相关阅读:
    Medium | LeetCode 347. 前 K 个高频元素 | 快速排序
    Medium | LeetCode 215. 数组中的第K个最大元素 | 快速排序
    Easy | LeetCode 75. 颜色分类 | 快速排序
    lib和dll
    windows使用cmd打印出当前路径下的所有文件名称
    windows中的sleep和Ubuntu中的sleep
    ‘mutex’ in namespace ‘std’ does not name a type
    gcc命令参数
    ubuntu18.04 使用pthread库
    vs2019 c语言配置pthreads多线程
  • 原文地址:https://www.cnblogs.com/lk1993/p/3316295.html
Copyright © 2011-2022 走看看