当前位置: 首页 > news >正文

POJ3415 Common Substrings

后缀数组+单调栈。

与之前那题非常类似,我们依旧是采用height数组对答案进行计算。

非常强的操作,我们分别对b匹配a,对a匹配b。我们会发现他的height会越匹配越小,所以我们建立单调上升的栈来存下a串中相同的,然后一旦遇到小的就将他更新换掉,然后对答案统计计算,栈要再开一维计算之前有哪些高的被砍掉的。

By:大奕哥

  1 #include<iostream>
  2 #include<iostream>
  3 #include<cstdio>
  4 #include<cstdlib>
  5 #include<algorithm>
  6 #include<cstring>
  7 using namespace std;
  8 const int N=2e5+10;
  9 int r[N],wa[N],wb[N],wv[N],wu[N],sa[N];
 10 int cmp(int *r,int a,int b,int l)
 11 {
 12     return r[a]==r[b]&&r[a+l]==r[b+l];
 13 }
 14 void da(int *r,int *sa,int n,int m)
 15 {
 16     int i,j,p;int *x=wa,*y=wb;
 17     for(i=0;i<m;++i)wu[i]=0;
 18     for(i=0;i<n;++i)wu[x[i]=r[i]]++;
 19     for(i=1;i<m;++i)wu[i]+=wu[i-1];
 20     for(i=n-1;i>=0;--i)sa[--wu[x[i]]]=i;
 21     
 22     for(j=1,p=1;p<n;j<<=1,m=p)
 23     {
 24         for(p=0,i=n-j;i<n;++i)y[p++]=i;
 25         for(i=0;i<n;++i)if(sa[i]>=j)y[p++]=sa[i]-j;
 26         for(i=0;i<n;++i)wv[i]=x[y[i]];
 27         for(i=0;i<m;++i)wu[i]=0;
 28         for(i=0;i<n;++i)wu[wv[i]]++;
 29         for(i=1;i<m;++i)wu[i]+=wu[i-1];
 30         for(i=n-1;i>=0;--i)sa[--wu[wv[i]]]=y[i];
 31         for(swap(x,y),p=1,x[sa[0]]=0,i=1;i<n;++i)
 32         x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;
 33     }
 34     return;
 35 }
 36 int rank[N],height[N],ans;
 37 void calcHeight(int *rank,int *sa,int n)
 38 {
 39     int i,j,k=0;
 40     for(i=1;i<=n;++i)rank[sa[i]]=i;
 41     for(i=0;i<n;height[rank[i++]]=k)
 42         for(k?k--:0,j=sa[rank[i]-1];r[i+k]==r[j+k];++k);
 43     return ;
 44 }
 45 char aa[N],bb[N];int k,sta[N][2];
 46 int main()
 47 {
 48     while(~scanf("%d",&k)&&k)
 49         {
 50         scanf("%s",aa);
 51         scanf("%s",bb);
 52         int n1=strlen(aa);
 53         int n2=strlen(bb);
 54         int n=n1+n2+1;
 55         for(int i=0;i<n;++i)
 56         {
 57             if(i<n1)r[i]=aa[i];
 58             else if(i==n1)r[i]='$';
 59             else r[i]=bb[i-n1-1];
 60         }r[n]=0;
 61         da(r,sa,n+1,216);
 62         calcHeight(rank,sa,n);
 63         int top=0;
 64         long long ans=0,tot=0;
 65         for(int i=1;i<=n;++i)
 66         {
 67             if(height[i]<k)top=0,tot=0;
 68             else
 69             {
 70                 int cnt=0;
 71                 if(sa[i-1]<n1){
 72                     cnt++;tot+=height[i]-k+1;
 73                 }
 74                 while(top&&height[i]<=sta[top][0])
 75                 {
 76                     tot+=(height[i]-sta[top][0])*sta[top][1];
 77                     cnt+=sta[top][1];top--;
 78                 }
 79                 sta[++top][0]=height[i];sta[top][1]=cnt;
 80                 if(sa[i]>n1){
 81                     ans+=tot;
 82                 }
 83             }
 84         }
 85         top=tot=0;
 86         for(int i=1;i<=n;++i)
 87         {
 88             if(height[i]<k)top=0,tot=0;
 89             else
 90             {
 91                 int cnt=0;
 92                 if(sa[i-1]>n1){
 93                     cnt++;tot+=height[i]-k+1;
 94                 }
 95                 while(top&&height[i]<=sta[top][0])
 96                 {
 97                     tot+=(height[i]-sta[top][0])*sta[top][1];
 98                     cnt+=sta[top][1];top--;
 99                 }
100                 sta[++top][0]=height[i];sta[top][1]=cnt;
101                 if(sa[i]<n1){
102                     ans+=tot;
103                 }
104             }
105         }
106         printf("%lld\n",ans);
107     }
108     return 0;
109 }

 

转载于:https://www.cnblogs.com/nbwzyzngyl/p/8195763.html

相关文章:

  • Mysql-where子句与having子句的区别
  • 2017总结及2018计划
  • 使用tree生成目录结构
  • BGP 路由属性 公认必遵 AS_PATH
  • Spark之从hdfs读取数据
  • Python3之uuid模块
  • Jquery学习笔记 - DOM操作
  • 【Java线程安全】 — ThreadLocal
  • python模块之collections模块
  • ElasticSearch集群介绍二
  • jquery ajax success 函数 异步调用方法中不能给全局变量赋值的原因及解决办法
  • 06人月神话阅读笔记
  • python之请求报文对比(假定最多二维字典)
  • spring_01介绍,搭建,概念,以及配置和属性注入
  • vue 手机端开发 小商铺 添加购物车 以及结算 功能
  • [译]Python中的类属性与实例属性的区别
  • 2017届校招提前批面试回顾
  • Android系统模拟器绘制实现概述
  •  D - 粉碎叛乱F - 其他起义
  • E-HPC支持多队列管理和自动伸缩
  • ES6系统学习----从Apollo Client看解构赋值
  • HTTP--网络协议分层,http历史(二)
  • Logstash 参考指南(目录)
  • Node项目之评分系统(二)- 数据库设计
  • passportjs 源码分析
  • python 装饰器(一)
  • Python学习笔记 字符串拼接
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • use Google search engine
  • 大数据与云计算学习:数据分析(二)
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • ------- 计算机网络基础
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • ​什么是bug?bug的源头在哪里?
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #、%和$符号在OGNL表达式中经常出现
  • #if和#ifdef区别
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • %check_box% in rails :coditions={:has_many , :through}
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (a /b)*c的值
  • (poj1.3.2)1791(构造法模拟)
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (六)vue-router+UI组件库
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)nsfocus-绿盟科技笔试题目
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (转载)从 Java 代码到 Java 堆
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • .gitignore文件_Git:.gitignore
  • .NET Framework 4.6.2改进了WPF和安全性
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)