[Trie]JZOJ 5795 词典

Description

 

Input

第一行两个数n,m,表示有n个字符串,m个询问。
接下来n行,每行一个字符串Ti 。
再接下来m行,每行一个字符串Si 。

Output

对于每个询问,输出一个ansi表示答案。
 

Sample Input

3 2
abcabc
aabc
abbc
aa
ba  

Sample Output

1
3 
 

Data Constraint

分析

暴力建trie,用一个last和mx数组记录答案,暴力遍历字典树输出即可

#include <fstream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
int c[5000002][3],last[5000002],mlen[5000002];
int cnt=1,rt=1;
int n,m;

void Build(int num,string s) {
    int len=s.length(),x=rt;
    for (int i=0;i<len;i++) {
        if (!c[x][s[i]-'a']) x=c[x][s[i]-'a']=++cnt;
        else x=c[x][s[i]-'a'],mlen[x]=max(mlen[x],num-last[x]-1);
        last[x]=num;
    }
}

int Search(string s) {
    int len=s.length(),x=rt;
    for (int i=0;i<len;i++)
    if (!(x=c[x][s[i]-'a'])) return n;
    return mlen[x]=max(mlen[x],n-last[x]);
}

void Solve() {
    ifstream fin("word.in");
    fin>>n>>m;
    string s;
    for (int i=1;i<=n;i++)
    fin>>s,Build(i,s);
    for (int i=1;i<=m;i++)
    fin>>s,printf("%d\n",Search(s));
}

int main() {
    freopen("word.out","w",stdout);
    Solve();
    fclose(stdout);
}
View Code

 

posted @ 2018-08-10 20:38  Vagari  阅读(122)  评论(0编辑  收藏  举报