首页 > 其他分享 >洛谷题单指南-字符串-P2922 [USACO08DEC] Secret Message G

洛谷题单指南-字符串-P2922 [USACO08DEC] Secret Message G

时间:2024-10-17 14:21:10浏览次数:1  
标签:01 前缀 int 洛谷题 len Secret MAXN cnt1 USACO08DEC

原题链接:https://www.luogu.com.cn/problem/P2922

题意解读:已知M个01串,给出N个01串,对于N个串的每一个,求在M个串中有多少与其有公共前缀,且前缀长度是两个串中较小者。

解题思路:

用Trie树存储M个01串,用cnt1[]记录某个节点结束的01串个数,cnt2[]记录经过某个节点的01串的数量

对于N个01串,在Trie树中查找,累加路径上01串的个数cnt1[u],这覆盖了M个串是前缀的情况

对于N个串中有前缀的情况,要在查找结束时,判断待查找串是否到末尾,如果到达末尾匹配的前缀数量要加上cnt2[u] - cnt1[u],避免重复计算。

100分代码:

#include <bits/stdc++.h>
using namespace std;

const int MAXN = 500005;
int m, n;
int trie[MAXN][2], idx, cnt1[MAXN], cnt2[MAXN];
int len, s[100005];

void add(int len, int s[100005])
{
    int u = 0;
    for(int i = 1; i <= len; i++)
    {
        if(!trie[u][s[i]]) trie[u][s[i]] = ++idx;
        u = trie[u][s[i]]; 
        cnt2[u]++; //记录经过u的01串个数
    }
    cnt1[u]++; //记录以节点u结束的01串个数
}

int find(int len, int s[100005])
{
    int u = 0, res = 0;
    for(int i = 1; i <= len; i++)
    {
        if(!trie[u][s[i]]) return res;
        u = trie[u][s[i]];
        res += cnt1[u]; //trie中找到一个完整01串,累加数量
    }
    if(u) res += cnt2[u] - cnt1[u]; //要查找的01串到末尾了,应该加上trie中经过u的所有01串数量,同时减去以u结束的01串数量,因为前面已经加过了
    return res;
}

int main()
{
    cin >> m >> n;
    while(m--)
    {
        cin >> len;
        for(int i = 1; i <= len; i++) cin >> s[i];
        add(len, s);
    }
    while(n--)
    {
        cin >> len;
        for(int i = 1; i <= len; i++) cin >> s[i];
        cout << find(len, s) << endl;;
    }
}

 

标签:01,前缀,int,洛谷题,len,Secret,MAXN,cnt1,USACO08DEC
From: https://www.cnblogs.com/jcwy/p/18471773

相关文章

  • 洛谷题单指南-字符串-P2375 [NOI2014] 动物园
    原题链接:https://www.luogu.com.cn/problem/P2375题意解读:计算字符串所有子串的不重叠相同前后缀数量。解题思路:1、KMP+暴力通过Next数组,可以计算所有子串相同前后缀的数量然后枚举Next数组,通过回跳Next[j]、Next[Next[j]-1]、Next[Next[Next[j]-1]-1]......来统计长度小于......
  • 洛谷题单指南-字符串-P3435 [POI2006] OKR-Periods of Words
    原题链接:https://www.luogu.com.cn/problem/P3435题意解读:定义字符串a是b的周期,当a是b的真前缀,且b是aa的前缀。给定字符串s,求s每一个前缀的最大周期长度之和。解题思路:针对字符串babababa进行样例模拟:前缀子串  最大周期  周期长度b空0ba空0babba2......
  • 洛谷题单指南-字符串-Test
    原题链接:https://www.luogu.com.cn/problem/CF25E https://codeforces.com/contest/25/problem/E题意解读:给定a,b,c三个字符串,求包含a、b、c的最短字符串长度。解题思路:要得到包含a、b、c的字符串,可以通过a、b、c连接形成,而要使得连接后的字符串最短,可以尽可能的利用重叠部分......
  • 洛谷题单指南-字符串-P1470 [USACO2.3] 最长前缀 Longest Prefix
    原题链接:https://www.luogu.com.cn/problem/P1470题意解读:求s最长前缀长度,使得可以拆解成p集合中的字符串解题思路:动态规划:设s字符串下标从1开始,p集合用set<string>保存所有的元素状态表示:设f[i]表示前i个字符s[0~i-1]是否能拆解成p中的元素状态计算:对于j=i-1开始往后倒......
  • 【Azure Cloud Service】使用Key Vault Secret添加.CER证书到Cloud Service Extended
    问题描述因为KeyVault的证书上传功能中,只支持pfx格式的证书,而中间证书,根证书不能转换为pfx格式,只能是公钥证书格式cet或者crt,能通过文本工具直接查看base64编码内容。如一个证书链文件中可以看见中间证书,根证书: 当把包含完成证书链的证书PFX上传到KeyVaultcertificate......
  • 洛谷题单指南-字符串-P5283 [十二省联考 2019] 异或粽子
    原题链接:https://www.luogu.com.cn/problem/P5283题意解读:n个整数,每次从从取l~r的数进行异或得到美味值,一共取k次,并计算这k个美味值之和的最大值。解题思路:1、如何O(1)的计算l~r数的异或,得到美味值可以借助前缀和思想,a[i]为第i个数,s[i]表示a[1]~a[i]每个数的异或值,要计算l~r的......
  • 洛谷题单指南-字符串-P2580 于是他错误的点名开始了
    原题链接:https://www.luogu.com.cn/problem/P2580题意解读:给n个字符串,再依次处理m个字符串,对于每个字符串,如果在前面n个字符串中输出OK,如果不在n个字符串中输出WRONG,如果在n个字符串中且不止一次查询过输出REPEAT。解题思路:1、set/map方法很简单直接,用set存下前n个字符串,map......
  • 洛谷题单指南-字符串-P1481 魔族密码
    原题链接:https://www.luogu.com.cn/problem/P1481题意解读:在n个字符串中找到最长的词链长度,定义字符串a、b、c可以形成词链,即a是b的前缀、b是c的前缀。解题思路:1、Trie树定义Trie树,也称前缀树、字典树,核心思想是将字符串拆解为单个字符,每个字符是树的一条边,节点是字符添加到树......
  • 洛谷题单指南-字符串-P4391 [BOI2009] Radio Transmission 无线传输
    原题链接:https://www.luogu.com.cn/problem/P4391题意解读:s1由若干个s2组成,求s2的最小长度,注意题目中说明s1是子串,但是不影响,可以认为s1是补全的由若干s2组成的字符串。解题思路:设s1由x个s2组成,如图所示设s1的Next数组从0开始,那么其最长相同前后缀长度为x-1个s2,即Next[s1.siz......
  • 洛谷题单指南-字符串-P3375 【模板】KMP
    原题链接:https://www.luogu.com.cn/problem/P3375题意解读:给定两个字符串:原串s,模式串p,求p在s中出现的所有位置,并输出p的长度为1~p.size()的子串的最长相同真前、后缀的长度。解题思路:KMP模版题,分两问,第一问通过KMP核心算法实现,第二问输出模式串的Next数组内容,接下来一一解读。......