istringstream split warning

这里面遇到了一个小问题,一直每调出来,getline(istr, cur, ‘/‘)这里面其实是如果一开始有一个/会多出一个空格来,因此要特殊处理这个,
另外/不需要转移,\需要转移为\, 记忆方法是\n \t这种里面\是用来转义的,因此Windows目录的\需要转义,Unix则不需要

https://code.google.com/codejam/contest/635101/dashboard#s=p0

多叉树,非常像Trie。出现的问题包括Node root 竟然不能作为参数传递,原因不明,于是改为Node*,然后里面发现不同目录可以重名,于是不能全局hash,然后发现又不是trie的26叉树
如果只有小写字母的话,过一会儿才想到每个Node定义一个hash表。

代码最大的问题就是之前的istringstream来split字符串忘记处理第一个空格了。

/*
Author: richard
Contact: zhangruichang112@gmail.com
*/
#include<set>
#include<map>
#include<list>
#include<cmath>
#include<queue>
#include<stack>
#include<ctime>
#include<cstdio>
#include<string>
#include<vector>
#include<climits>
#include<cstdlib>
#include<cstring>
#include<sstream>
#include<fstream>
#include<iostream>
#include<algorithm>
#include <unordered_set>
#include <unordered_map>
using namespace std;
const int maxn = 1e6 + 10;
typedef long long LL;
typedef unsigned long long ULL;
//int, -2^31~2^31-1    -2.1*10^9~2.1*10^9 (-2147483648-2147483647)
//unsigned int, 0~2^32-1  0~4.2*10^9
//long long  -2^63~2^63-1 -9*10^18~9*10^18
//unsigned long long 0~2^64-1  0~1.8*10^19
typedef pair<int, int> pii;
#define f first
#define s second
int getint(){
    int t = 0, flag = 1; char c = getchar();
    while (c<'0' || c>'9' || c == '-')
    {
        if (c == '-')
            flag = -1;
        c = getchar();
    }
    while (c >= '0'&&c <= '9')
        t = t * 10 + c - '0', c = getchar();
    return t*flag;
}
int GCD(int m, int n)
{
    if(!m) return n;
    return GCD(n%m, m);//yushu and chushu
}
//int a[maxn], n;
int n, m;
string str[100], query[100];
struct Node
{
    string val;
    unordered_map<string, Node*> next;
    Node():val("")
    {
        next.clear();
    }
};
Node* root;
void BuildTree()
{
    for(int i=0;i<n;i++)
    {
        Node* p=root;
        istringstream istr(str[i]);
        string cur;
        while(getline(istr, cur, '/'))
        {
            if(cur=="") continue;
            if(p->next.find(cur)==p->next.end())
            {
                Node* tmp=new Node();
                p->next[cur]=tmp;;
                p=tmp;
            }
            else
                p=p->next[cur];
        }
    }
}

int QueryTree()
{
    int ans=0;
    for(int i=0;i<m;i++)
    {
        Node*p=root;
        istringstream istr(query[i]);
        string cur;
        while(getline(istr, cur, '/'))
        {
            if(cur=="") continue;
            if(p->next.find(cur)==p->next.end())
            {
                Node* tmp=new Node();
                p->next[cur]=tmp;;
                p=tmp;ans++;
            }
            else
                p=p->next[cur];
        }
    }
    return ans;
}

int main()
{

#ifndef ONLINE_JUDGE
    freopen ("A-large-practice.in" , "r" , stdin);
    freopen ("A-large-practice.out" , "w" , stdout);
#endif

    int t;
    cin>>t;
    for(int ti=1;ti<=t;ti++)
    {
        cin>>n>>m;
        for(int i=0;i<n;i++) cin>>str[i];
        for(int i=0;i<m;i++) cin>>query[i];
        root=new Node();
        BuildTree();
        int ans=QueryTree();
        printf("Case #%d: %d\n", ti, ans);
    }
    return 0;
}

Posted by richard爱闹 - 3月 17 2015
如需转载,请注明: 本文来自 Richard