码迷,mamicode.com
首页 > Web开发 > 详细

201803-3 URL映射(50)

时间:2019-03-17 19:53:17      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:event   cto   close   else   vector   alt   rgs   bre   node   

技术图片
#include<bits/stdc++.h>
using namespace std;

const int maxn = 100 + 3;
const int maxm = 100 + 3;
int n, m;

struct Node{
    string s;
    string name;
    vector<Node*>next;
};

Node root;

void dfs(Node* u)
{
    if(u->name != "") cout << u->name;
    cout << u->s <<  ;
    for(int i = 0; i < u->next.size(); i++)
        dfs(u->next[i]);
}

void addNode(string s1, string s2)
{
    vector<string>ss1;
    int last = 0;
    for(int i = 1; i < s1.size(); i++){
        if(s1[i] == /){
            ss1.push_back(s1.substr(last + 1, i - last - 1));
            last = i;
        }else if(i == s1.size() - 1){
            ss1.push_back(s1.substr(last + 1, i - last));
        }
    }
//    for(string s : ss1)
//        cout << s << endl;
    Node* u = &root;
    for(int i = 0; i < ss1.size(); i++){
        bool ok = 0;
        for(int j = 0; j < u->next.size(); j++){
            if(u->next[j]->s == ss1[i]){
                u = u->next[j];
                ok = 1;
                break;
            }
        }
        if(!ok){
            Node* p = new Node(); p->s = ss1[i];
            if(i == ss1.size() - 1) p->name = s2;
            u->next.push_back(p);
            u = p;
        }
    }

    //dfs(&root);

}

bool match(string pattern, string& text) //同时去掉前导0
{
    if(pattern == "<path>") return true;
    if(pattern[0] != <) return pattern == text;
    bool isnum = true;
    for(int i = 0; i < text.size(); i++){
        if(!isdigit(text[i])){
            isnum = false;
            break;
        }
    }
    if(isnum){
         //cout << "fffffffffffffffffffff" << text << endl;
        int i = 0;
        while(text[i] == 0) i++;
        text.erase(0, i);
        //cout << "fffffffffffffffffffff" << text << endl;
        return pattern == "<int>";
    }
    return pattern == "<str>";
}
void solve(string s1)
{
    vector<string>ss1;
    int last = 0;
    for(int i = 1; i < s1.size(); i++){
        if(s1[i] == /){
            ss1.push_back(s1.substr(last + 1, i - last - 1));
            last = i;
        }else if(i == s1.size() - 1){
            ss1.push_back(s1.substr(last + 1, i - last));
        }
    }
    vector<string>args;
    string name;
    Node* u = &root;
    int OK = true;
    int path = 0;
    for(int i = 0; i < ss1.size(); i++){
        string& s = ss1[i];
        int ok = 0;
        for(int j = 0; j < u->next.size(); j++){
            if(match(u->next[j]->s, s)){
                if(u->next[j]->s == "<path>"){
                    for(int k = i; k < ss1.size(); k++){
                        if(args.size() == 0) args.push_back("");
                        args[args.size() - 1] += (k == i ? "" : "/") + ss1[k];

                    }
                    name = u->next[j]->name;
                    path = 1;
                    break;
                }
                if(i == ss1.size() - 1){
                    if(u->next[j]->name != ""){
                        name = u->next[j]->name;
                        ok = 1;
                    }
                } else ok = 1;
                if(u->next[j]->s[0] == <) args.push_back(s);
                u = u->next[j];
                break;
            }
        }
        if(path) break;
        if(!ok){
            OK = false;
        }
    }
    if(!OK) cout << "404" << endl;
    else{
        cout << name;
        for(int i = 0; i < args.size(); i++)
            cout <<   << args[i];
        cout << endl;
    }

}
int main()
{
    //freopen("in.txt", "r", stdin);
    //freopen("out.txt", "w", stdout);
    while(cin >> n >> m && n){

        root.s = "/";
        for(int i = 0; i < n; i++){
            string s1, s2;
            cin >> s1 >> s2;
            addNode(s1, s2);
        }
        for(int i = 0; i < m; i++){
            string s; cin >> s;
            solve(s);
        }
        //dfs(&root);
    }
    return 0;
}
View Code

 

201803-3 URL映射(50)

标签:event   cto   close   else   vector   alt   rgs   bre   node   

原文地址:https://www.cnblogs.com/sanshi-2018/p/10548335.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!