T2 选ID trie树

T2 选ID

Description

? 机房似乎有许多人没有 ID,热心同志小 A 为了服务人民,所有决定帮大家找一个合适的 ID。

? 小 A 觉得一个合适的 ID,和这个人的相关程度应该是比较高的,就像他的 ID 里有他的名字缩写一样。为了量化这个相关程度,他定义一个人的名字 \(S\) 和他的 ID \(T\) 的匹配值的大小为\(lcp\)(\(S\),\(T\))?。现在有 \(n\) 个人,小 A 想好了 \(n\) 个 ID,他想知道如果把 ID 分配给机房众人,最后能够得到的最大的匹配值之和是多少。

Input Format

? 第一行一个 \(n\),表示人数。

? 接下来 \(n\) 行,每行一个字符串,表示一个人的姓名。

? 接下来 \(n\) 行,每行一个字符串,表示一个 ID。

? 保证姓名和 ID 只包含小写字母。

Output

? 输出一行表示最大的匹配值。

Solution

我们可以直接 利用\(trie\)树来贪心,树上每一个点都可以对答案产生\(x\)的贡献(\(x\)为多少个这样的节点),而是否产生取决于\(T\)字符串是否可以到达这个节点,所以贪心来做,每搜到一个节点就判断\(x\)是否大于0,即还能不能产生贡献,若能则\(ans++\),再把当前节点的x--,不能就继续搜下去。注意,一旦在树上失配就return,以保证前面产生贡献的点全满足前缀。

#include<bits/stdc++.h>
#define N 1000010
#define M 30000010
using namespace std;
int tr[N][26],val[N];
int n,now,cnt,ans;
char s[M];
void ins()
{
    int now=0,len=strlen(s);
    for(int i=0;i<len;i++)
    {
        if(!tr[now][s[i]-'a']) tr[now][s[i]-'a']=++cnt;
        now=tr[now][s[i]-'a'];
        val[now]++;
    }
}
void sol()
{
    int now=0,len=strlen(s);
    for(int i=0;i<len;i++)
    {
        if(!tr[now][s[i]-'a']) return;
        now=tr[now][s[i]-'a'];
        if(val[now])
        {
            ans++,val[now]--;
        }

    }
}
int main()
{
    int i,j;
    //scanf("%d",&n);
    cin>>n;
    for(i=1;i<=n;i++) scanf("%s",s),ins();
    for(i=1;i<=n;i++) scanf("%s",s),sol();
    printf("%d",ans);
    return 0;
}

原文地址:https://www.cnblogs.com/yzxx/p/11723845.html

时间: 2024-11-08 20:10:57

T2 选ID trie树的相关文章

4.15 省选模拟赛 编码 trie树 前缀和优化建图 2-sat

好题 np. 对于20分 显然可以爆搜. 对于50分 可以发现每个字符串上的问号要么是0,要么是1.考虑枚举一个字符串当前是0还是1 这会和其他字符串产生矛盾. 所以容易 发现这是一个2-sat问题. 拆点 把任意两个产生矛盾的字符串进行连边.然后最后判矛盾即可. n^2枚举 建图 判断矛盾时使用字符串hash 要分类讨论4种情况. using namespace std; const int MAXN=1010,maxn=500010,cc1=19260817,cc2=114514; int

SPOJ11414 COT3 博弈论 + Trie树合并

考虑对于每个子树从下往上依次考虑 对于叶子节点而言,如果可以染色,那么其\(sg\)值为\(1\),否则为\(0\) 考虑往上合并 如果选择了\(x\),那么后继状态就是其所有子树 如果选了其他子树中的一点,那么后继状态的构成如图所示 也就是,到当前根为止的所有其他子树的\(sg\)值异或上本身 那么,我们可以考虑维护一个数据结构,每次往上的时候,对于一棵子树内的点,异或上其他子树的\(sg\)值 至于查\(sg\)值,可以用一个支持查\(mex\)的东西 还需要合并 \(Trie\)树是一个不

bzoj4103异或运算 可持久化trie树

要去清华冬令营了,没找到2016年的题,就先坐一坐15年的. 因为n很小,就按照b串建可持久化trie树,a串暴力枚举. 其他的直接看代码. #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; inline int read() { int x=0,f=1,ch=getchar(); while(ch<'0'||ch

hihoCoder 1014 Trie树

#1014 : Trie树 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这一天,他们遇到了一本词典,于是小Hi就向小Ho提出了那个经典的问题:“小Ho,你能不能对于每一个我给出的字符串,都在这个词典里面找到以这个字符串开头的所有单词呢?” 身经百战的小Ho答道:“怎么会不能呢!你每给我一个字符串,我就依次遍历词典里的所有单词,检查你给我的字

hiho一下 第二周&amp;第四周:从Trie树到Trie图

hihocoder #1014 题目地址:http://hihocoder.com/problemset/problem/1014 hihocoder #1036 题目地址: http://hihocoder.com/problemset/problem/1036 trie图其实就是trie树+KMP #1014trie树 #include<stdio.h> #include <algorithm> #include <cstring> #include <str

POJ 2503 Babelfish (Trie树 或 map)

Babelfish Time Limit: 3000MS        Memory Limit: 65536K Total Submissions: 34278        Accepted: 14706 Description You have just moved from Waterloo to a big city. The people here speak an incomprehensible dialect of a foreign language. Fortunately

HDU 1277 全文检索 (Trie树应用 好题)

全文检索 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 1304    Accepted Submission(s): 416 Problem Description 我们大家经常用google检索信息,但是检索信息的程序是很困难编写的:现在请你编写一个简单的全文检索程序. 问题的描述是这样的:给定一个信息流文件,信息完全有数字组成,

[ACM] POJ 2418 Hardwood Species (Trie树或map)

Hardwood Species Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 17986   Accepted: 7138 Description Hardwoods are the botanical group of trees that have broad leaves, produce a fruit or nut, and generally go dormant in the winter. Ameri

Trie树 + DFS - CSU 1457 Boggle

Boggle Problem's Link: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1457 Mean: 给定n个串,有m个询问. 每个询问给你一个4*4的字符矩阵,你可以在这个字符矩阵中任意字符出发,向四个方向走(已走过的不可重复走),走出一个字符串. 如果n个串中有对应的串和走出的字符串相同,那么需要求出: 1.不同长度的串给了不同的权值,n个串中出现的串的总权值是多少? 2.从出现的字符串中找一个最长的出来,如果有多个,找一个字典