题目链接:https://www.luogu.org/problem/P2463

【题意】

求出N个串中都出现的相同子串的最长长度,相同子串的定义如题:所有元素加上一个数变成另一个,则这两个串相同,可以很简单的得出,差分后的串相同即相同。

【思路】

首先肯定是要对N个串分别进行差分,然后将N个串合并成一个串,首尾相接即可,但要标记那些数属于哪一个Mi(后边要进行check),这里呢要注意,记得将串分隔开来,

不然会WA,这里我用的分隔方法是在串之间加0,合并完成后,题目就可变成求最长的不重叠的重复N次的最长子串长度。因为如果长度为k的串出现了N次,那么他的前缀

也一定出现了N次,所以此题满足单调性,可以进行二分答案。

【check方法】

找到一段排名连续的[l, r]都满足height[i]>=mid( l<i<=r )的连续的区间,对该区间[l, r]进行处理,判断所有的sa[i]( l<=i<=r )的所属Mi,如果有N个不同的Mi即满足条件,返回true,

反之返回false。

上代码

#include <bits/stdc++.h>
using namespace std;const int maxn = 1e6 + 5;
int n, t, M, b[maxn], num[110], a[maxn];
int sa[maxn], x[maxn], c[maxn], y[maxn], rk[maxn], height[maxn];
bool vis[maxn];
inline void get_sa(){int m = 2000;for( int i=1; i<=n; i++ ) ++c[x[i]=a[i]];for( int i=1; i<=m; i++ ) c[i] += c[i-1];for( int i=n; i; i-- ) sa[c[x[i]]--] = i;for( int k=1; k<=n; k<<=1 ){int now = 0;for( int i=n-k+1; i<=n; i++ ) y[++now] = i;for( int i=1; i<=n; i++ ) if(sa[i]>k) y[++now] = sa[i]-k;for( int i=0; i<=m; i++ ) c[i] = 0;for( int i=1; i<=n; i++ ) ++c[x[i]];for( int i=1; i<=m; i++ ) c[i] += c[i-1];for( int i=n; i; i-- ) sa[c[x[y[i]]]--] = y[i], y[i]=0;swap(x, y);x[sa[1]] = now = 1;for( int i=2; i<=n; i++ )x[sa[i]] = (y[sa[i]]==y[sa[i-1]] && y[sa[i]+k]==y[sa[i-1]+k]) ? now : ++now;if( now>=n ) return ;m = now;}
}inline void get_height(){int k = 0;for( int i=1; i<=n; i++ ) rk[sa[i]] = i;for( int i=1; i<=n; i++ ){if( rk[i]==1 ) continue;if( k ) k--;int j = sa[rk[i]-1];while( j+k<=n && i+k<=n && a[j+k]==a[i+k] ) k++;height[rk[i]] = k;}
}inline bool check1( int l, int r ){if( r-l+1<t ) return 0;                 //!!!!!!!r-l+1<t  不是r-l+1<nint tmp = 0;memset( vis, 0, sizeof(vis) );for( int i=l; i<=r; i++ )if( !vis[b[sa[i]]] ){tmp ++;vis[b[sa[i]]] = 1;}return tmp == t;
}inline bool check( int x ){int l=1, r=1;while( l<=n ){while( height[r+1]>=x ) r++;if( check1(l, r) ) return 1;l = r+1; r = l;}return 0;
}int main(){freopen("in.txt", "r", stdin);scanf("%d", &t);int len = 0;for( int i=1; i<=t; i++ ){scanf("%d", &M);for( int j=0; j<M; j++ ) scanf("%d", &num[j]);for( int j=1; j<M; j++ ){a[++n] = num[j]-num[j-1];           //进行差分b[n] = i;}a[++n] = 0;         //分隔不同的串b[n] = i;}// for( int i=1; i<=n; i++ ) cout << a[i] << endl;
    get_sa();get_height();// for( int i=1; i<=n; i++ ) cout << height[i] <<endl;int l=1, r=n;int ans=0;while( l<=r ){int mid = l+r>>1;if( check(mid) ) ans = mid, l=mid+1;else r = mid-1;}printf("%d\n", ans+1);return 0;
}

转载于:https://www.cnblogs.com/WAautomaton/p/11563306.html

洛谷P2463 [SDOI2008]Sandy的卡片(后缀数组SA + 差分 + 二分答案)相关推荐

  1. 洛谷 P2463 [SDOI2008]Sandy的卡片 解题报告

    P2463 [SDOI2008]Sandy的卡片 题意 给\(n(\le 1000)\)串,定义两个串相等为"长度相同,且一个串每个数加某个数与另一个串完全相同",求所有串的最长公 ...

  2. 【bzoj4698】[Sdoi2008] Sandy的卡片 后缀数组

    题目描述 Sandy和Sue的热衷于收集干脆面中的卡片.然而,Sue收集卡片是因为卡片上漂亮的人物形象,而Sandy则是为了积攒卡片兑换超炫的人物模型.每一张卡片都由一些数字进行标记,第i张卡片的序列 ...

  3. 洛咕 P2463 [SDOI2008]Sandy的卡片

    哈希水过. 首先这是一段delta相同的序列,按照套路差分一下,b[i]=a[i]-a[i-1],然后就是这些序列的最长公共子段 由于数据范围很小,就可以二分,枚举第一个序列的子段然后每个子序列暴力c ...

  4. Luogu P2463 [SDOI2008]Sandy的卡片

    题目链接 \(Click\) \(Here\) 真的好麻烦啊..事实证明,理解是理解,一定要认认真真把板子打牢,不然调锅的时候真的会很痛苦..(最好是八分钟能无脑把\(SA\)码对的程度\(QAQ\) ...

  5. 洛谷P2178 [NOI2015]品酒大会 后缀数组+单调栈

    P2178 [NOI2015]品酒大会 题目链接 https://www.luogu.org/problemnew/show/P2178 题目描述 一年一度的"幻影阁夏日品酒大会" ...

  6. 洛谷P4094 [HEOI2016/TJOI2016]字符串【后缀数组+主席树+st表】

    时空限制 2000ms / 256MB 题目描述 佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物.生日礼物放在一个神奇的箱子中.箱子外边写了一个长为n的字符串s,和m个问题.佳媛姐姐必须正确 ...

  7. [BZOJ4698][SDOI2008]Sandy的卡片(后缀自动机)

    差分之后就是求多串LCS. 对其中一个串建SAM,然后把其它串放在上面跑. 对SAM上的每个状态都用f[x]记录这个状态与当前串的最长匹配长度,res[x]是对每次的f[x]取最小值.答案就是res[ ...

  8. 洛谷 P1800 software_NOI导刊2010提高(06)(二分答案+DP检验)

    P1800 software_NOI导刊2010提高(06) 标签 二分答案 难度 普及/提高- 题目描述 一个软件开发公司同时要开发两个软件,并且要同时交付给用户,现在公司为了尽快完成这一任务,将每 ...

  9. [SDOI2008]Sandy的卡片

    题目描述 Sandy和Sue的热衷于收集干脆面中的卡片. 然而,Sue收集卡片是因为卡片上漂亮的人物形象,而Sandy则是为了积攒卡片兑换超炫的人物模型. 每一张卡片都由一些数字进行标记,第i张卡片的 ...

最新文章

  1. CentOS 6/7 忘记root密码,重新设置的方法
  2. formValidator BUG
  3. python笔记6--编码
  4. python每一句后面可以加也可以不加分号
  5. json前台后台解析和拼接使用
  6. matlab全域基函数,多项式函数插值:全域多项式插值(一)单项式基插值、拉格朗日插值、牛顿插值 [MATLAB]...
  7. 一个漫长的程序人生路程,如何突破5000元大关?几年前的2-3线城市的参考,现在未必...
  8. 求护士的心理阴影面积 | 今日最佳
  9. Spring和Hibernate的自定义审核日志
  10. java override 访问权限_java基础之——访问修饰符(private/default/protected/public)
  11. Java笔记-异常机制中try(...)中括号的用法
  12. android线程卡死,Android主线程为什么不因为Loop死循环卡死
  13. SAP License:SAP的联产品和副产品
  14. 使用带Arduino IDE WIZ820io的ATmega1284P
  15. 自动化Ansible常见命令
  16. WebApp用组件方式开发全站
  17. Win11无线网络适配器有感叹号不能上网怎么解决
  18. 动态规划入门及规则分析(典型)
  19. 微软ad域服务器 管理用户,威联通NAS助企业解决Windows AD域账户管理
  20. 6-5 Approximating Eigenvalues (40分)

热门文章

  1. 定了!华为P30/P30 Pro正式官宣:3月26日见
  2. “阿里离职女高管”二次回应质疑:晒股票、期权等证据
  3. 从0到1告诉你搭建完整Python+requests接口自动化测试框架!
  4. 2018春节前新马泰游
  5. 数据挖掘算法之离散化和二元化
  6. Android 音频开发(四) 如何播放一帧音频数据下
  7. 请概述可视化卷积神经网络的中间输出的基本思想。_万字长文:特征可视化技术(CAM)...
  8. chechbox 的颜色android,Android 之 CheckBox 详解
  9. 【算法】剑指 Offer 17. 打印从1到最大的n位数
  10. 【Flink】Flink SQL 架构 以及 执行逻辑