查找字符串

描述

小明得到了一张写有奇怪字符串的纸,他想知道一些字符串出现了多少次,但这些字符串太多了,他想找你帮忙,你能帮他吗?输入字符包括所有小写字母、‘@’、‘+’。

 
输入
第一行包含一个整数T(T<=100).表示测试数据组数。 接下来每组数据第一行包含两个整数n,m(n,m<100000),分别表示有n个字符串,小明要问你m次。 接下来n行,每行包含一个字符串,长度不大于15。 接下来m行,每行包含一个字符串,表示小明要问该串出现的次数。
输出
输出每组小明询问数串出现的次数。
#include<iostream>
using namespace std;
class node
{
    public:
    char d;
    int flag;
    int num;
    node *l,*r;
    node()
    {
        num=0;
        flag=0;
        l=r=NULL;
    }
};
void create(node *&root,char str[]);
int search(node *root,char str[]);
int main()
{
    int T,n,m;
    char str[18];
    cin>>T;
    node *root=new node;
    while(T--)
    {
        root->l=root->r=NULL;
        cin>>n>>m;
        while(n--)
        {
            cin>>str;
            create(root,str);
        }
        while(m--)
        {
            cin>>str;
            cout<<search(root,str)<<endl;
        }
    }
}
void create(node *&root,char str[])
{
    node *p=root;
    char *q=str;
    while(*q)
    {
        if(p->l==NULL)
        {
            p->l=new node;
            p=p->l;
            p->d=*q;
        }
        else
        {
            p=p->l;
            while(p->r&&p->d!=*q)
            p=p->r;
            if(p->d!=*q)
            {
                p->r=new node;
                p=p->r;
                p->d=*q;
            }
        }
        ++q;
    }
    p->flag=1;
    p->num++;
}
int search(node *root,char str[])
{
    node *p=root;
    char *q=str;
    while(*q)
    {
        if(p->l==NULL)
        return 0;
        else
        {
            p=p->l;
            while(p->r&&p->d!=*q)
            p=p->r;
            if(p->d!=*q)
            return 0;
        }
        ++q;
    }
    return p->num;
}

 

posted on 2013-04-28 13:04  耶稣爱你  阅读(241)  评论(0编辑  收藏  举报