【XSY2384】【GDOI2017】微信
致去年的我:这是道广义SAM模板题啊……
题意:
Description

Input

Output

HINT
$1\leq N\leq 20$,$1\leq Q\leq 10^5$,字符串总长$\leq 10^6$
题解:
题意就是求若干个trie的最长公共子串……
先把所有trie并起来建广义SAM,记录一下每个节点原来属于哪个trie,由于$N$很小,可以直接状压DP,按照parent树从上往下转移就好了……
预处理答案,询问可以$O(1)$处理;
但是本题有一个坑点是广义SAM必须要bfs建立以达到严格$O(n\times 字符集大小)$的时间复杂度,否则会被特殊构造的数据卡到85分。
代码:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define inf 2147483647
#define eps 1e-9
using namespace std;
typedef long long ll;
typedef double db;
int n,qq,t,top,len,last,cnt=,tot=,rt=,rts[],s1[],s2[],son[][],fa[],mx[],s[],p[],ch[][],ss[],f[];
char st[],nw[],qr[];
queue<int>q;
void ins(char *s,int len,int id){
int nw=rts[len-];
if(!ch[nw][s[len]-'a'])ch[nw][s[len]-'a']=++cnt;
ss[ch[nw][s[len]-'a']]|=id;
rts[len]=ch[nw][s[len]-'a'];
}
int extend(int p,int ch,int id){
int np=++tot;
mx[np]=mx[p]+;
s[np]=id;
for(;p&&!son[p][ch];p=fa[p])son[p][ch]=np;
if(!p)fa[np]=rt;
else{
int q=son[p][ch];
if(mx[q]==mx[p]+)fa[np]=q;
else{
int nq=++tot;
s[nq]=id;
mx[nq]=mx[p]+;
memcpy(son[nq],son[q],sizeof(son[q]));
fa[nq]=fa[q];
fa[q]=fa[np]=nq;
for(;p&&son[p][ch]==q;p=fa[p])son[p][ch]=nq;
}
}
return last=np;
}
void build(){
q.push(rt);
p[rt]=;
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=;i<;i++){
int v=ch[u][i];
if(v){
p[v]=extend(p[u],i,ss[v]);
q.push(v);
}
}
}
for(int i=;i<=tot;i++)s1[mx[i]]++;
for(int i=;i<=tot;i++)s1[i]+=s1[i-];
for(int i=;i<=tot;i++)s2[s1[mx[i]]--]=i;
for(int i=tot;i;i--){
s[fa[s2[i]]]|=s[s2[i]];
f[s[s2[i]]]=max(f[s[s2[i]]],mx[s2[i]]);
}
}
int main(){
scanf("%d",&n);
rts[]=;
for(int i=;i<=n;i++){
scanf("%s",st);
len=strlen(st);
top=;
for(int j=;j<len;j++){
if(st[j]=='<')top--;
else{
nw[++top]=st[j];
ins(nw,top,<<(i-));
}
}
}
build();
for(int i=(<<n)-;i>=;i--){
for(int j=;j<n;j++){
if((<<j)&i){
f[i^(<<j)]=max(f[i^(<<j)],f[i]);
}
}
}
scanf("%d",&qq);
while(qq--){
scanf("%s",qr);
len=strlen(qr);
t=;
for(int i=len-;i>=;i--)t=t*+qr[i]-'';
printf("%d\n",f[t]);
}
return ;
}
【XSY2384】【GDOI2017】微信的更多相关文章
- SPOJ 1812 LCS2 - Longest Common Substring II (后缀自动机、状压DP)
手动博客搬家: 本文发表于20181217 23:54:35, 原地址https://blog.csdn.net/suncongbo/article/details/85058680 人生第一道后缀自 ...
- 微信企业号 获取AccessToken
目录 1. AccessToken介绍 2. 示例代码 1. AccessToken介绍 1.1 什么是AccessToken AccessToken即访问凭证,业务服务器每次主动调用企业号接口时需要 ...
- 微信小程序开发心得
微信小程序也已出来有一段时间了,最近写了几款微信小程序项目,今天来说说感受. 首先开发一款微信小程序,最主要的就是针对于公司来运营的,因为,在申请appid(微信小程序ID号)时候,需要填写相关的公司 ...
- 微信公众号开发之VS远程调试
目录 (一)微信公众号开发之VS远程调试 (二)微信公众号开发之基础梳理 (三)微信公众号开发之自动消息回复和自定义菜单 前言 微信公众平台消息接口的工作原理大概可以这样理解:从用户端到公众号端一个流 ...
- 微信应用号(小程序)开发IDE配置(第一篇)
2016年9月22日凌晨,微信宣布“小程序”问世,当然只是开始内测了,微信公众平台对200个服务号发送了小程序内测邀请.那么什么是“小程序”呢,来看微信之父怎么说 看完之后,相信大家大概都有些明白了吧 ...
- SQLSERVER走起微信公众帐号已经开通搜狗微信搜索
SQLSERVER走起微信公众帐号已经开通搜狗微信搜索 请打开下面链接 http://weixin.sogou.com/gzh?openid=oIWsFt-hiIb_oYqQHaBMoNwRB2wM ...
- SQLSERVER走起微信公众帐号全新改版 全新首页
SQLSERVER走起微信公众帐号全新改版 全新首页 今天,SQLSERVER走起微信公众帐号增加了首页功能 虽然还是订阅号,不过已经对版面做了比较大的修改,希望各位亲用得放心.用得安心O(∩_∩)O ...
- 微信小程序体验(2):驴妈妈景区门票即买即游
驴妈妈因为出色的运营能力,被腾讯选为首批小程序内测单位.驴妈妈的技术开发团队在很短的时间内完成了开发任务,并积极参与到张小龙团队的内测问题反馈.驴妈妈认为,移动互联网时代,微信是巨大的流量入口,也是旅 ...
- WPF 微信 MVVM
公司的同事离职了,接下来的日子可能会忙碌,能完善DEMO的时间也会少了,因此,把做的简易DEMO整体先记录一下,等后续不断的完善. 参考两位大神的日志:WEB版微信协议部分功能分析.[完全开源]微信客 ...
随机推荐
- 检測wifi是否须要portal验证 公共场所wifi验证
何为wifi portal验证? 平时在商场,咖啡厅,银行等公共场所.我们手机提示:有可用WLAN.这些WIFI能够直接连接,不须要password,但须要我们手动在手机网页上进行验证,通常是输入一个 ...
- 公告:CSDN博客积分系统升级(暂行版)
各位亲爱的用户: CSDN博客频道将于2014年10月22日23点至10月23日8点进行积分系统的升级,升级期间会影响大家的正常訪问和操作.给大家带来不便.敬请广大用户谅解.很多其它详情见>&g ...
- 项目结构、包、编译为exe!
一个java源文件里至多有一个public类,该类的名称必须与源文件名称称同样.也能够没有public类.文件名称与随意一个类名一致就可以. 包 类似于cpp的namespace,是对类的再封装,防止 ...
- java开发环境配置(win8 64位)
自己配置java环境时是自己上网找资料装的,,有讲的好的也有讲的不是很清晰的,,自己也入了几个坑..所以在这里自己整理了下win8配置JDK的教程. 下载JDK 首先我们需要下载java开发工具包JD ...
- mac 下作流程图工具omnigraffle
omnigraffle:http://www.uzzf.com/soft/91710.html 含盖激活码: Name: mojado Serial: JYFE-JRJN-GSOT-GRAG-EVJI ...
- mybits 操作指南
第一.一对一: <resultMap type="com.zktx.platform.entity.tb.Module" id="BaseResultMap&quo ...
- 获取android的SDK或者手机目录路径
获取android的SDK或者手机目录路径 Google为我们提供了API来获取SDK或者手机目录路径: 1.获取SD卡目录 File file1 = Environment.getExternalS ...
- spark 按照key 分组 然后统计每个key对应的最大、最小、平均值思路——使用groupby,或者reduceby
What you're getting back is an object which allows you to iterate over the results. You can turn the ...
- 搭建自己的websocket server_1
用Node.js实现一个WebSocket的Server. https://github.com/sitegui/nodejs-websocket#event-errorerr nodejs-we ...
- Angular2之路由学习笔记
目前工作中项目的主要技术栈是Angular2 在这里简单记录一下遇到的问题以及解决方案. 这篇笔记主要记录Angular2 的路由. 官方文档链接:https://angular.cn/docs/ts ...