【POJ1226】Substrings(后缀数组,二分)
题意:
n<=10,len<=100
思路:
只有一个字符串的时候特判一下
- #include<cstdio>
- #include<cstring>
- #include<string>
- #include<cmath>
- #include<iostream>
- #include<algorithm>
- #include<map>
- #include<set>
- #include<queue>
- #include<vector>
- using namespace std;
- typedef long long ll;
- typedef unsigned int uint;
- typedef unsigned long long ull;
- typedef pair<int,int> PII;
- typedef vector<int> VI;
- #define fi first
- #define se second
- #define MP make_pair
- #define N 210000
- #define MOD 1000000007
- #define eps 1e-8
- #define pi acos(-1)
- #define oo 1000000000
- char ch[N];
- int n,i,s[N],sa[N],wa[N],wb[N],wc[N],wd[N],height[N],rank[N],
- a[N],b[N],num[N],M;
- int read()
- {
- int v=,f=;
- char c=getchar();
- while(c<||<c) {if(c=='-') f=-; c=getchar();}
- while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
- return v*f;
- }
- bool cmp(int *r,int a,int b,int l)
- {
- return r[a]==r[b]&&r[a+l]==r[b+l];
- }
- void getsa(int *r,int *sa,int n,int m)
- {
- int *x=wa,*y=wb,j,p;
- for(i=;i<n;i++) wc[x[i]=r[i]]++;
- for(i=;i<m;i++) wc[i]+=wc[i-];
- for(i=n-;i>=;i--) sa[--wc[x[i]]]=i;
- for(j=,p=;p<n;j*=,m=p)
- {
- p=;
- for(i=n-j;i<n;i++) y[p++]=i;
- for(i=;i<n;i++)
- if(sa[i]>=j) y[p++]=sa[i]-j;
- for(i=;i<n;i++) wd[i]=x[y[i]];
- for(i=;i<m;i++) wc[i]=;
- for(i=;i<n;i++) wc[wd[i]]++;
- for(i=;i<m;i++) wc[i]+=wc[i-];
- for(i=n-;i>=;i--) sa[--wc[wd[i]]]=y[i];
- swap(x,y);
- p=; x[sa[]]=;
- for(i=;i<n;i++) x[sa[i]]=cmp(y,sa[i-],sa[i],j)?p-:p++;
- }
- }
- void getheight(int *r,int *sa,int n)
- {
- int i,j,k=;
- for(i=;i<=n;i++) rank[sa[i]]=i;
- for(i=;i<n;height[rank[i++]]=k)
- {
- if(k) k--;
- j=sa[rank[i]-];
- while(r[i+k]==r[j+k]) k++;
- }
- }
- void init()
- {
- memset(s,,sizeof(s));
- memset(sa,,sizeof(sa));
- memset(wa,,sizeof(wa));
- memset(wb,,sizeof(wb));
- memset(wc,,sizeof(wc));
- memset(wd,,sizeof(wd));
- memset(height,,sizeof(height));
- memset(rank,,sizeof(rank));
- }
- bool isok(int K)
- {
- int i=;
- while(i<n)
- {
- i++;
- if(height[i]>=K)
- {
- int st=i;
- while(i<=n&&height[i]>=K) i++;
- for(int j=;j<=M;j++) b[j]=;
- for(int j=max(,st-);j<=i-;j++)
- {
- int t=sa[j];
- b[num[t]]++;
- }
- int flag=;
- for(int j=;j<=M;j++)
- if(!b[j]){flag=; break;}
- if(flag) return ;
- }
- }
- return ;
- }
- int main()
- {
- //freopen("poj1226.in","r",stdin);
- //freopen("poj1226.out","w",stdout);
- int cas;
- scanf("%d",&cas);
- while(cas--)
- {
- init();
- scanf("%d",&M);
- n=-;
- int p=;
- for(int i=;i<=M;i++)
- {
- scanf("%s",ch);
- int t=strlen(ch);
- if(M==) printf("%d\n",t);
- for(int j=;j<t;j++)
- {
- s[++n]=ch[j]+;
- num[n]=i;
- }
- s[++n]=p++;
- num[n]=;
- for(int j=t-;j>=;j--)
- {
- s[++n]=ch[j]+;
- num[n]=i;
- }
- s[++n]=p++;
- num[n]=;
- }
- if(M==) continue;
- //printf("1\n");
- getsa(s,sa,n+,);
- getheight(s,sa,n);
- //for(int i=2;i<=n;i++) printf("%d\n",height[i]);
- int L=;
- int R=;
- int last=;
- while(L<=R)
- {
- int mid=(L+R)>>;
- if(isok(mid)){last=mid; L=mid+;}
- else R=mid-;
- }
- printf("%d\n",last);
- memset(num,,sizeof(num));
- }
- return ;
- }
【POJ1226】Substrings(后缀数组,二分)的更多相关文章
- POJ1226 Substrings ——后缀数组 or 暴力+strstr()函数 最长公共子串
题目链接:https://vjudge.net/problem/POJ-1226 Substrings Time Limit: 1000MS Memory Limit: 10000K Total ...
- POJ1226:Substrings(后缀数组)
Description You are given a number of case-sensitive strings of alphabetic characters, find the larg ...
- poj 3415 Common Substrings - 后缀数组 - 二分答案 - 单调栈
题目传送门 传送点I 传送点II 题目大意 给定串$A, B$,求$A$和$B$长度大于等于$k$的公共子串的数量. 根据常用套路,用一个奇怪的字符把$A$,$B$连接起来,然后二分答案,然后按mid ...
- BZOJ 3230: 相似子串( RMQ + 后缀数组 + 二分 )
二分查找求出k大串, 然后正反做后缀数组, RMQ求LCP, 时间复杂度O(NlogN+logN) -------------------------------------------------- ...
- BZOJ_2946_[Poi2000]公共串_后缀数组+二分答案
BZOJ_2946_[Poi2000]公共串_后缀数组+二分答案 Description 给出几个由小写字母构成的单词,求它们最长的公共子串的长度. 任务: l 读入单 ...
- 【bzoj4310】跳蚤 后缀数组+二分
题目描述 很久很久以前,森林里住着一群跳蚤.一天,跳蚤国王得到了一个神秘的字符串,它想进行研究. 首先,他会把串分成不超过 k 个子串,然后对于每个子串 S,他会从S的所有子串中选择字典序最大的那一个 ...
- BZOJ 1717 [USACO06DEC] Milk Patterns (后缀数组+二分)
题目大意:求可重叠的相同子串数量至少是K的子串最长长度 洛谷传送门 依然是后缀数组+二分,先用后缀数组处理出height 每次二分出一个长度x,然后去验证,在排序的后缀串集合里,有没有连续数量多于K个 ...
- POJ 1743 [USACO5.1] Musical Theme (后缀数组+二分)
洛谷P2743传送门 题目大意:给你一个序列,求其中最长的一对相似等长子串 一对合法的相似子串被定义为: 1.任意一个子串长度都大于等于5 2.不能有重叠部分 3.其中一个子串可以在全部+/-某个值后 ...
- Poj 1743 Musical Theme(后缀数组+二分答案)
Musical Theme Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 28435 Accepted: 9604 Descri ...
- Poj 3261 Milk Patterns(后缀数组+二分答案)
Milk Patterns Case Time Limit: 2000MS Description Farmer John has noticed that the quality of milk g ...
随机推荐
- k8s framework
reference 1. k8s master framework master master 是k8s cluster运行着daemon服务:kube-apiserver, kube-schedul ...
- 洛谷 P1514 引水入城
这次不说闲话了,直接怼题 这道题用bfs其实并不难想,但比较困难的是怎么解决满足要求时输出蓄水厂的数量.其实就像其他题解说的那样,我们可以用bfs将它转化成一个区间覆盖问题,然后再进行贪心. 首先枚举 ...
- AOP日志组件 多次获取post参数
AOP日志组件 多次获取post参数 需求:新增接口日志组件.通过拦截器对接口URL进行拦截处理,然后将接口post请求的参数与结果,写入日志表. 问题:POST方法的参数是存储在request.ge ...
- 【求助】NdisSend,自定义数据包发送失败?
做ndis hook的时候,自定义了一个数据包,包结构应该没有问题,填充NDIS_PACKET结构是这样的,先初始化: NdisAllocatePacketPool(&nStat ...
- vim的卸载以及环境的配置小记
一.背景 由于之前配置错误,导致我的YouCompleteMe这个插件不能用了,一直提示: ERROR:Required vim compiled with +python. YouCompleteM ...
- 四:SQL语句介绍
前言:介绍SQL语句及其大致的分类 一:SQL语句介绍(Structured SQL Lanage) 结构化的查询语言 是一种特殊的编程语言 是一种数据库查询和程序设计语言 用于存取数据及查询.更新和 ...
- java获取本地计算机MAC地址
java获取本地计算机MAC地址代码如下: public class SocketMac { //将读取的计算机MAC地址字节转化为字符串 public static String transByte ...
- Ubuntu中安装配置 JDK与apache
一,前期准备: 1.下载apach网址:https://tomcat.apache.org/download-90.cgi 3.下载:jdk网址:http://www.oracle.com/techn ...
- shell 中exec、source以及bash的区别
在bash shell中,source.exec以及sh都可以用来执行shell script,但是它们的差别在哪里呢? sh:父进程会fork一个子进程,shell script在子进程中执行 so ...
- Linux下配置MySQL主从复制
一.环境准备 本次准备两台Linux主机,操作系统都为CentOS6.8, 都安装了相同版本的MySQL.(MySQL5.7). 主从服务器的防火墙都开启了3306端口. 相关信息如下: [主服务器] ...