hihoCoder #1656 前后缀查询
题目大意
给定 $n$($n\le 50000$) 个由小写英文字母构成的字符串,每个串的长度不超过 10,每个串有一个权值 $v$ ($1\le v\le 100000$)。
回答 $m$($m\le 50000$)组询问,询问格式为两个字符串 $p,s$,求输入中满足「以 $p$ 为前缀并且以 $s$ 为后缀」的串的最大权值。
解法
我的做法:字典树套字典树。
标程做法:将输入中长为 $k$ 的字符串变成 $k$ 个新字符串;
例子:
abc 变成
a#cba
ab#cba
abc#cba
用所有新串建一棵字典树。
对于查询 $p,s$ ,在字典树中查询 $p+`\#`+ \mathrm{reverse}(s)$ 。
实现要点
字典树的每个节点开长为 26 的数组(可能)会 MLE,可以用「左儿子-右兄弟」方式建树。
Highlights
我写了一个字典树模板类,自认为很 fancy。
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
template<class T>
struct trie{
struct node{
char x;
size_t l, r;
};
using val_t = T;
vector<pair<node,val_t>> a;
val_t _null;
trie(){
a.push_back({});
}
size_t size()const {
return a.size();
}
// LC-RS: left-child right-sibling
size_t get_child(size_t i, char x)const{
for(i=a[i].first.l; ; i=a[i].first.r){
if(a[i].first.x == x || !a[i].first.r)
return i;
}
}
template <typename lambda>
void insert(const string &s, lambda &&upd){
size_t i=0;
upd(a[i].second);
for(auto x: s){
auto _i = get_child(i, x);
if(a[_i].first.x == x)
i = _i;
else{
if(!_i){
a[i].first.l=a.size();
}
else{
a[_i].first.r=a.size();
}
i = a.size();
a.push_back({});
a.back().first.x = x;
}
upd(a[i].second);
}
}
const val_t &operator[](const string &s)const {
size_t i = 0;
for(auto x: s){
i = get_child(i, x);
if(a[i].first.x != x)
return _null;
}
return a[i].second;
}
};
trie<trie<int>> a;
int main(){
#ifdef LOCAL
freopen("in.txt", "r", stdin);
#endif
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m;
cin >> n >> m;
for(int i=0; i<n; i++){
string s;
int v;
cin >> s >> v;
auto upd = [s, v](auto &val)mutable {
reverse(s.begin(), s.end());
val.insert(s, [v](auto &val){val=max(val, v);});
};
a.insert(s, upd);
}
for(int i=0; i<m; i++){
string pre, suf;
cin >> pre >> suf;
reverse(suf.begin(), suf.end()); // error-prone
int res = a[pre][suf];
cout << (res? res: -1) << '\n';
}
return 0;
}
代码中用到了 generic lambda:
auto upd = [s, v](auto &val)mutable {
reverse(s.begin(), s.end());
val.insert(s, [v](auto &val){val=max(val, v);});
};
这是 C++ 14 引入的新特性,如果你使用的编译器尚不支持 C++ 14,可以将「lambda 表达式」改成「generic functor」。
hihoCoder #1656 前后缀查询的更多相关文章
- codeforces 579D D. "Or" Game(前后缀+贪心)
题目链接: D. "Or" Game time limit per test 2 seconds memory limit per test 256 megabytes input ...
- Objective-C 【NSString-字符串比较&前后缀检查及搜索】
———————————————————————————————————————————NSString 字符串比较 #import <Foundation/Foundation.h> vo ...
- poj 2752 Seek the Name, Seek the Fame【KMP算法分析记录】【求前后缀相同的子串的长度】
Seek the Name, Seek the Fame Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 14106 Ac ...
- [LeetCode] Prefix and Suffix Search 前后缀搜索
Given many words, words[i] has weight i. Design a class WordFilter that supports one function, WordF ...
- Hibernate给表和字段设置前后缀及分隔符
在<一口一口吃掉Hibernate(一)--使用SchemaExport生成数据表>中介绍了如何生成数据表.但是这只是最基本的.hibernate在生成或者操作数据库时,会受一些限制.比如 ...
- HDU 2594(求最长公共前后缀 kmp)
题意是在所给的两个字符串中找最长的公共前后缀,即第一个字符串前缀和第二个字符串后缀的最长相等串. 思路是将两个字符串拼接在一起,然后直接套用 kmp 算法即可. 要注意用 next 会报编译错误,改成 ...
- poj 2752 求一个字符串所有的相同前后缀
求一个字符串所有的相同前后缀Sample Input ababcababababcababaaaaaSample Output 2 4 9 181 2 3 4 5 #include <iostr ...
- HDU 2594 最长相同前后缀
Sample Inputclintonhomerriemannmarjorie Sample Output0rie 3 输入两个字符串 ,求最长相同前后缀直接把两个字符串连接在一起求next就行了,唯 ...
- python 删除2天前后缀为.log的文件
python脚本 删除2天前后缀为.log的文件 #!/usr/local/python/bin/python #-*-coding=utf8 -*- import time import os,sy ...
随机推荐
- UVALive 4670 Dominating Patterns (AC自动机)
AC自动机的裸题.学了kmp和Trie以后不难看懂. 有一些变化,比如0的定义和f的指向,和建立失配边,以及多了后缀连接数组last.没有试过把失配边直接当成普通边(一开始还是先这样写吧). #inc ...
- Android(java)学习笔记123:Android MediaPlayer 播放prepareAsync called in state 8解决办法
1. 使用android MediaPlayer播放音频文件时,有时会出现prepareasync called in state 8错误. 以下方法可以避免这个异常出现. 第1种方法: priva ...
- vue 修改端口
- Lemonade Trade
4990: Lemonade Trade 时间限制: 1 Sec 内存限制: 128 MB Special Judge提交: 88 解决: 17[提交][状态][讨论版][命题人:admin] ...
- 查看numpy的类型
查看一个变量的类型:type(img) 查看array中的数据值的类型:img.dtype 查看array的形状:img.shape
- BCB:使用CppWebBrowser判断网页加载完成
void __fastcall TForm1::CppWebBrowser1DocumentComplete(TObject *Sender, LPDISPATCH pDisp, Variant *U ...
- Bootstrap 标签
本章将讲解bootstrap标签,标签可用于计数,提示和页面上其它的标记显示.使用class.laber来显示标签,如下面的实例所示 <!DOCTYPE html><html> ...
- 使用CAShapeLayer实现复杂的View的遮罩效果
一.案例演示 最近在整理一个聊天的项目的时候,发送图片的时候,会有一个三角的指向效果,指向这张图片的发送者.服务端返回给我们的图片只是一张矩形的图片,我们如何把一张矩形的图片或者View,加上一层自定 ...
- linux系统入门—文件管理
目录 linux系统入门-文件管理 系统目录结构 目录管理 linux系统入门-文件管理 系统目录结构 几乎所有的计算机操作系统都是使用目录结构组织文件.具体来说就是在一个目录中存放子目录和文件,而在 ...
- Struts2和Spring MVC 区别 今天面试被问到了
虽然说没有系统的学习过Spring MVC框架, 但是工作这么长时间, 基本上在WEB层使用的都是Spring MVC, 自己觉得Struts2也是一个不错的WEB层框架, 这两种框架至今自己还未有比 ...