传送门


思路

设\(dp_i\)表示以\(i\)结尾的\(A\)串,能达到的最长长度。

然后发现这显然可以\(i\)往自己控制的\(k\)连边,\(k\)往能匹配的\(j\)连边,就是个最长路,只要建出图来就完事了。

显然可以用数据结构得到两点之间是否有边,于是就获得了40分的好成绩。

考虑优化这个建图,字符串也就那么几个数据结构,那就后缀树吧。

有了后缀树,可以发现\(k\)会向\(k\)所在的节点的子树连边,注意不包括\(k\)自己的节点。

那么自己节点怎么办呢?把在这里的所有串拆开然后按长度排一下序即可。

然后就是用虚点优化,随便搞就好了。

这省选题好像也不难

代码先咕着,下午再写。

uptade:下午由于数组开小狂WA,怒调3小时无果,还因为size(),lower_bound()等函数炸掉而一脸懵逼……

数组就应该能开多大开多大……


代码

  1. #include<bits/stdc++.h>
  2. clock_t t=clock();
  3. namespace my_std{
  4. using namespace std;
  5. #define pii pair<int,int>
  6. #define fir first
  7. #define sec second
  8. #define MP make_pair
  9. #define rep(i,x,y) for (int i=(x);i<=(y);i++)
  10. #define drep(i,x,y) for (int i=(x);i>=(y);i--)
  11. #define go(x) for (int i=head[x];i;i=edge[i].nxt)
  12. #define templ template<typename T>
  13. #define sz 1204040
  14. typedef long long ll;
  15. typedef double db;
  16. mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
  17. templ inline T rnd(T l,T r) {return uniform_int_distribution<T>(l,r)(rng);}
  18. templ inline bool chkmax(T &x,T y){return x<y?x=y,1:0;}
  19. templ inline bool chkmin(T &x,T y){return x>y?x=y,1:0;}
  20. templ inline void read(T& t)
  21. {
  22. t=0;char f=0,ch=getchar();double d=0.1;
  23. while(ch>'9'||ch<'0') f|=(ch=='-'),ch=getchar();
  24. while(ch<='9'&&ch>='0') t=t*10+ch-48,ch=getchar();
  25. if(ch=='.'){ch=getchar();while(ch<='9'&&ch>='0') t+=d*(ch^48),d*=0.1,ch=getchar();}
  26. t=(f?-t:t);
  27. }
  28. template<typename T,typename... Args>inline void read(T& t,Args&... args){read(t); read(args...);}
  29. char __sr[1<<21],__z[20];int __C=-1,__zz=0;
  30. inline void Ot(){fwrite(__sr,1,__C+1,stdout),__C=-1;}
  31. inline void print(register int x)
  32. {
  33. if(__C>1<<20)Ot();if(x<0)__sr[++__C]='-',x=-x;
  34. while(__z[++__zz]=x%10+48,x/=10);
  35. while(__sr[++__C]=__z[__zz],--__zz);__sr[++__C]='\n';
  36. }
  37. void file()
  38. {
  39. #ifndef ONLINE_JUDGE
  40. freopen("a.in","r",stdin);
  41. #endif
  42. }
  43. inline void chktime()
  44. {
  45. #ifndef ONLINE_JUDGE
  46. cout<<(clock()-t)/1000.0<<'\n';
  47. #endif
  48. }
  49. #ifdef mod
  50. ll ksm(ll x,int y){ll ret=1;for (;y;y>>=1,x=x*x%mod) if (y&1) ret=ret*x%mod;return ret;}
  51. ll inv(ll x){return ksm(x,mod-2);}
  52. #else
  53. ll ksm(ll x,int y){ll ret=1;for (;y;y>>=1,x=x*x) if (y&1) ret=ret*x;return ret;}
  54. #endif
  55. // inline ll mul(ll a,ll b){ll d=(ll)(a*(double)b/mod+0.5);ll ret=a*b-d*mod;if (ret<0) ret+=mod;return ret;}
  56. }
  57. using namespace my_std;
  58. char s[sz];
  59. int N,n,m;
  60. int la[sz],ra[sz],lb[sz],rb[sz];
  61. int fa[sz],len[sz],ch[sz][27],cnt=1,lst=1;
  62. int edp[sz];
  63. void insert(int c)
  64. {
  65. int cur=++cnt,p=lst;lst=cur;
  66. len[cur]=len[p]+1;
  67. while (p&&!ch[p][c]) ch[p][c]=cur,p=fa[p];
  68. if (!p) return (void)(fa[cur]=1);
  69. int q=ch[p][c];
  70. if (len[p]+1==len[q]) return (void)(fa[cur]=q);
  71. int t=++cnt;
  72. memcpy(ch[t],ch[q],sizeof(ch[q]));
  73. len[t]=len[p]+1;fa[t]=fa[q];
  74. while (p!=-1&&ch[p][c]==q) ch[p][c]=t,p=fa[p];
  75. fa[q]=fa[cur]=t;
  76. }
  77. void calcEndPos(){int x=1;drep(i,N,1) x=ch[x][s[i]-'a'+1],edp[i]=x;}
  78. struct hh{int t,nxt;}edge[sz];
  79. int head[sz],ecnt;
  80. void make_edge(int f,int t){edge[++ecnt]=(hh){t,head[f]};head[f]=ecnt;}
  81. int Fa[sz][25];
  82. void dfs1(int x,int fa){Fa[x][0]=fa;rep(i,1,20) Fa[x][i]=Fa[Fa[x][i-1]][i-1];go(x) dfs1(edge[i].t,x);}
  83. vector<pii>va[sz],vb[sz];
  84. void ins(int id,int lenth,int p)
  85. {
  86. drep(i,20,0) if (Fa[p][i]&&len[Fa[p][i]]>=lenth) p=Fa[p][i];
  87. if (id<=n) va[p].push_back(MP(lenth,id));
  88. else vb[p].push_back(MP(lenth,id));
  89. }
  90. int son[sz],cc;
  91. int deg[sz];
  92. struct hhh{int f,t,w,nxt;}E[sz];
  93. int Head[sz],Ecnt;
  94. void MakeEdge(int f,int t,int w){++deg[t];E[++Ecnt]=(hhh){f,t,w,Head[f]};Head[f]=Ecnt;}
  95. int lastt=0;
  96. void dfs2(int x)
  97. {
  98. sort(va[x].begin(),va[x].end());
  99. int nxt=cc+1,las;cc+=va[x].size()+1;las=cc;
  100. drep(i,(int)va[x].size()-1,0) MakeEdge(nxt+i,nxt+i+1,0),MakeEdge(nxt+i,va[x][i].sec,va[x][i].fir);
  101. rep(i,0,(int)vb[x].size()-1)
  102. {
  103. int pos=lower_bound(va[x].begin(),va[x].end(),MP(vb[x][i].fir,-1))-va[x].begin();
  104. MakeEdge(vb[x][i].sec,nxt+pos,0);
  105. }
  106. go(x) dfs2(edge[i].t),MakeEdge(las,son[edge[i].t],0);
  107. son[x]=nxt;
  108. }
  109. ll dp[sz];
  110. bool vis[sz];
  111. void work()
  112. {
  113. cin>>(s+1);
  114. N=strlen(s+1);
  115. drep(i,N,1) insert(s[i]-'a'+1);
  116. calcEndPos();
  117. rep(i,2,cnt) make_edge(fa[i],i);
  118. dfs1(1,0);
  119. int K,x,y;
  120. read(n);
  121. rep(i,1,n) read(la[i],ra[i]),ins(i,ra[i]-la[i]+1,edp[la[i]]),dp[i]=ra[i]-la[i]+1;
  122. read(m);
  123. rep(i,1,m) read(lb[i],rb[i]),ins(i+n,rb[i]-lb[i]+1,edp[lb[i]]);
  124. read(K);
  125. while (K--) read(x,y),MakeEdge(x,y+n,0);
  126. cc=n+m;
  127. dfs2(1);
  128. queue<int>q;
  129. ll ans=0;
  130. rep(i,1,cc) if (!deg[i]) q.push(i);
  131. while (!q.empty())
  132. {
  133. int x=q.front();q.pop();vis[x]=1;
  134. chkmax(ans,dp[x]);
  135. for (int i=Head[x];i;i=E[i].nxt)
  136. {
  137. int v=E[i].t;--deg[v];chkmax(dp[v],dp[x]+E[i].w);
  138. if (!deg[v]) q.push(v);
  139. }
  140. }
  141. bool flg=1;
  142. rep(i,1,cc) flg&=vis[i];
  143. printf("%lld\n",flg?ans:-1ll);
  144. rep(i,1,N) s[i]='\0',edp[i]=0;
  145. rep(i,1,n) la[i]=ra[i]=0;
  146. rep(i,1,m) lb[i]=rb[i]=0;
  147. rep(i,1,cnt) { fa[i]=len[i]=head[i]=0; rep(j,1,26) ch[i][j]=0; }
  148. rep(i,1,cc) Head[i]=0,va[i].clear(),vb[i].clear(),son[i]=0,deg[i]=0,dp[i]=0,vis[i]=0;
  149. ecnt=cc=Ecnt=0;cnt=lst=1;
  150. }
  151. int main()
  152. {
  153. file();
  154. int T;read(T);
  155. while (T--) work();
  156. return 0;
  157. }

洛谷P5284 [十二省联考2019]字符串问题 [后缀树]的更多相关文章

  1. 洛谷.5284.[十二省联考2019]字符串问题(后缀自动机 拓扑 DP)

    LOJ BZOJ 洛谷 对这题无话可说,确实比较...裸... 像dls说的拿拓扑和parent树一套就能出出来了... 另外表示BZOJ Rank1 tql... 暴力的话,由每个\(A_i\)向它 ...

  2. 洛谷P5284 [十二省联考2019]字符串问题(SAM+倍增+最长路)

    题面 传送门 题解 首先,我们把串反过来,那么前缀就变成后缀,建一个\(SAM\).我们发现一个节点的后缀是它的所有祖先 那么我们是不是直接按着\(parent\)树建边就可以了呢? 显然不是.我们假 ...

  3. [十二省联考2019]字符串问题——后缀自动机+parent树优化建图+拓扑序DP+倍增

    题目链接: [十二省联考2019]字符串问题 首先考虑最暴力的做法就是对于每个$B$串存一下它是哪些$A$串的前缀,然后按每组支配关系连边,做一遍拓扑序DP即可. 但即使忽略判断前缀的时间,光是连边的 ...

  4. 洛谷.5283.[十二省联考2019]异或粽子(可持久化Trie 堆)

    LOJ 洛谷 考场上都拍上了,8:50才发现我读错了题=-= 两天都读错题...醉惹... \(Solution1\) 先求一遍前缀异或和. 假设左端点是\(i\),那么我们要在\([i,n]\)中找 ...

  5. 洛谷P5289 [十二省联考2019]皮配(01背包)

    啊啊啊边界判错了搞死我了QAQ 这题是一个想起来很休闲写起来很恶心的背包 对于\(k=0\)的情况,可以发现选阵营和选派系是独立的,对选城市选阵营和学校选派系分别跑一遍01背包就行了 对于\(k> ...

  6. 洛谷 5291 [十二省联考2019]希望(52分)——思路+树形DP

    题目:https://www.luogu.org/problemnew/show/P5291 考场上写了 16 分的.不过只得了 4 分. 对于一个救援范围,其中合法的点集也是一个连通块. 2n 枚举 ...

  7. P5284 [十二省联考2019]字符串问题

    这是一道涵盖了字符串.图论.数据结构三个方面的综合大题. 把这道题放在D1T2的人应该拖出去打 前置芝士 首先,您至少要会topsort. 其次,如果您只想拿个暴力分,字符串Hash就足够了:如果您想 ...

  8. Luogu P5284 [十二省联考2019]字符串问题

    好难写的字符串+数据结构问题,写+调了一下午的说 首先理解题意后我们对问题进行转化,对于每个字符串我们用一个点来代表它们,其中\(A\)类串的点权为它们的长度,\(B\)类串的权值为\(0\) 这样我 ...

  9. 【题解】Luogu P5284 [十二省联考2019]字符串问题

    原题传送门 我用sa做的本题 (码量似乎有点大) 先对原串建sa 考虑如何建图: 从大到小枚举长度len 先将height中等于len的两个位置在并查集合并起来,将lst也合并(lst是链表) 再将长 ...

随机推荐

  1. 全面系统讲解CSS 工作应用+面试一步搞定

  2. centos7之zabbix服务器的常规优化

    一.硬件需求分析 1.首先我们来分析一个硬件需求,这里我以400个agent计算,CPU建议是4核,内存不要少于8GB,硬盘只要不是用了很久的主机就行,容量的话建议300GB基本就够使用好一段时间了, ...

  3. Tensorflow模型的格式

    转载:https://cloud.tencent.com/developer/article/1009979 tensorflow模型的格式通常支持多种,主要有CheckPoint(*.ckpt).G ...

  4. python-装饰器初解

    # 装饰器的作用# 不想修改函数的调用方式( func() 还是这样调用),但是还想再原来函数前后添加功能# timer() 就是一个装饰器函数,只对一个函数,有一些装饰作用 import time ...

  5. Spring Boot 2.x 编写 RESTful API (三) 程序层次 & 数据传输

    用Spring Boot编写RESTful API 学习笔记 程序的层次结构 相邻层级的数据传输 JavaBean 有一个 public 的无参构造方法 属性 private,且可以通过 get.se ...

  6. nginx springboot配置

    1.下载安装nginx 2.nginx.conf文件修改参数 上方是代理后的端口,代理的server.下方是需要代理的路径 3.windows 下操作指令 启动 直接点击Nginx目录下的nginx. ...

  7. Java复习总结——String

    概览 String被声明为final,因此它不可被继承. public final class String implements java.io.Serializable, Comparable&l ...

  8. 备忘录模式-Memento Pattern(Java实现)

    备忘录模式-Memento Pattern Memento备忘录设计模式是一个保存另外一个对象内部状态拷贝的对象,这样以后就可以将该对象恢复到以前保存的状态. 本文中的场景: 有一款游戏可以随时存档, ...

  9. PowerEdge R430 机架式服务器安装( Ubuntu server 14.04.1 、PHP5.5.9、PHP-redis2.8、Phalcon3.1)

    未解决问题:换成静态路由的话,怎么就 apt-get udpate 出现错误信息! 解决办法:么有设置网关 一.Ubuntu 系统下载地址: https://certification.ubuntu. ...

  10. centos7.4下的python3.6的安装

    1.系统环境 :centos 7.4 最小化安装 2.安装过程 yum install wget      安装下载工具 wget https://www.python.org/ftp/python/ ...