trie-51nod1526 分配笔名

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1526
狗题;
卡我内存6mb;
所以我只有95分;
好像用指针,用结构体,内存会大;
唉~
这道题目,我们先用真名去建树;
对于每一个名字,我们从root更新下去;
走到一个点,这个点的v就++;
然后对于笔名,我们在这个树上查询;
查询直到查完或者查不到;
每查询到一个点;
这个值如果>0就对答案有贡献;
就v–;
v=0就不管了;
为什么这样是对的;
这个显然啊;
我恐怕说不清;
自己体会体会把;

#include<iostream>
#include<cstdio>
#include<cstring>
#define Ll long long
#define ui unsigned int
using namespace std;
struct trie{
    int nxt[26];
    int v;
    trie(){memset(nxt,0,sizeof nxt);v=0;}
}T[800005];
int n,m,ans,ll;
string c; 
void init(){
    int o=0;
    for(int i=0;i<m;i++){
        int x=c[i]-'a';
        if(!T[o].nxt[x])T[o].nxt[x]=++ll;
        o=T[o].nxt[x];
        T[o].v++;
    }
}
void cfb(){
    int o=0;
    for(int i=0;i<m;i++){
        int x=c[i]-'a';
        if(!T[o].nxt[x])return;
        o=T[o].nxt[x];
        if(T[o].v)ans++,T[o].v--;
    }
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        cin>>c;
        m=c.length();init();
    }
    for(int i=1;i<=n;i++){
        cin>>c;
        m=c.length();cfb();
    }
    printf("%d",ans);
}

指针在64位系统里,占8个字节;

posted @ 2017-03-15 14:52  largecube233  阅读(109)  评论(0编辑  收藏  举报