题目大意:有$n$个字符串,求这$n$个字符串中最长的相似公共字串,相似的定义是加上一个数后相同

题解:差分,建广义后缀自动机,然后求出每个点在多少个字符串中出现过,若在$n$个中都出现,就更新答案

卡点:

 

C++ Code:

  1. #include <cstdio>
  2. #include <map>
  3. #include <vector>
  4. #define maxn 1010
  5.  
  6. std::vector<int> s[maxn];
  7. namespace SAM {
  8. #define N (maxn * 100 << 1)
  9. int R[N], fail[N];
  10. std::map<int, int> nxt[N];
  11. int idx = 1, lst = 1;
  12.  
  13. void append(int ch) {
  14. int p = lst, np = lst = ++idx; R[np] = R[p] + 1;
  15. for (; p && !nxt[p].count(ch); p = fail[p]) nxt[p][ch] = np;
  16. if (!p) fail[np] = 1;
  17. else {
  18. int q = nxt[p][ch];
  19. if (R[p] + 1 == R[q]) fail[np] = q;
  20. else {
  21. int nq = ++idx; R[nq] = R[p] + 1;
  22. fail[nq] = fail[q], fail[q] = fail[np] = nq;
  23. nxt[nq] = nxt[q];
  24. for (; p && nxt[p].count(ch) && nxt[p][ch] == q; p = fail[p]) nxt[p][ch] = nq;
  25. }
  26. }
  27. }
  28.  
  29. int bel[N], cnt[N];
  30. void jmp(int p, int tg) {
  31. for (; bel[p] != tg; p = fail[p]) bel[p] = tg, cnt[p]++;
  32. }
  33. void work(int i) {
  34. int p = 1;
  35. for (std::vector<int>::iterator it = s[i].begin(); it != s[i].end(); ++it) jmp(p = nxt[p][*it], i);
  36. }
  37. int query(int n) {
  38. int res = 0;
  39. for (int i = 1; i <= idx; i++) if (cnt[i] == n) {
  40. res = std::max(res, R[i] + 1);
  41. }
  42. return res;
  43. }
  44. #undef N
  45. }
  46.  
  47. int n;
  48. int main() {
  49. scanf("%d", &n);
  50. for (int i = 1, lst, x, m; i <= n; i++) {
  51. scanf("%d%d", &m, &lst); SAM::lst = 1;
  52. for (int j = 1; j < m; j++) {
  53. scanf("%d", &x);
  54. SAM::append(x - lst);
  55. s[i].push_back(x - lst);
  56. lst = x;
  57. }
  58. }
  59. for (int i = 1; i <= n; i++) SAM::work(i);
  60. printf("%d\n", SAM::query(n));
  61. return 0;
  62. }

  

[洛谷P2463][SDOI2008]Sandy的卡片的更多相关文章

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

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

  2. 洛谷P2463 [SDOI2008]Sandy的卡片(后缀数组SA + 差分 + 二分答案)

    题目链接:https://www.luogu.org/problem/P2463 [题意] 求出N个串中都出现的相同子串的最长长度,相同子串的定义如题:所有元素加上一个数变成另一个,则这两个串相同,可 ...

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

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

  4. bzoj4698 / P2463 [SDOI2008]Sandy的卡片

    P2463 [SDOI2008]Sandy的卡片 直接二分长度暴力匹配....... 跑的还挺快 (正解是后缀数组的样子) #include<iostream> #include<c ...

  5. P2463 [SDOI2008]Sandy的卡片[差分+串拼接后缀数组]

    P2463 [SDOI2008]Sandy的卡片 套路都差不多,都是差分后二分答案找lcp.只是这题要把多个串拼接起来成为一个大串,中间用某些值域中没有的数字相隔(最好间隔符都不一样想想为什么),排序 ...

  6. Luogu P2463 [SDOI2008]Sandy的卡片

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

  7. P2463 [SDOI2008]Sandy的卡片

    写一种\(O(nm)\)的做法,也就是\(O(\sum 串长)\)的. 先通过差分转化,把每个数变成这个数与上一个数的差,第一个数去掉,答案就是最长公共子串+1 按照套路把所有串拼起来,中间加一个分隔 ...

  8. 【BZOJ4698】[SDOI2008]Sandy的卡片

    [BZOJ4698][SDOI2008]Sandy的卡片 题面 flag倒了. bzoj 洛谷 题解 首先题目的区间加很丑对吧, 将每个串差分一下,就可以转化为 求: 给定\(N\)个串,求他们的最长 ...

  9. BZOJ 4698: Sdoi2008 Sandy的卡片

    4698: Sdoi2008 Sandy的卡片 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 106  Solved: 40[Submit][Stat ...

随机推荐

  1. NavRouter

    使用方法只需要跟vue-router一样正常使用即可,这里我们新加了一个路由跳转方法nav: router.nav()//参数同router.replace一样. 路由跳转策略 首先说下路由跳转过程, ...

  2. 解决replace格式替换后光标定位问题

    场景:格式化银行卡444格式 手机号344格式 身份证号684格式 校验数据格式,replace后光标定位错乱 或光标一直定位在最后 解决,只针对input,代码用的vue: 获取光标位置: getC ...

  3. 「日常训练」Paths and Trees(Codeforces Round 301 Div.2 E)

    题意与分析 题意是这样的,定义一个从某点出发的所有最短路方案中,选择边权和最小的最短路方案,称为最短生成树. 现在求一棵最短生成树,输出总边权和与选取边的编号. 我们首先要明白这样一个结论:对一个图求 ...

  4. 在VMware虚拟机下安装Linux CentOS7

    1.首先下载并安装VMware虚拟机,下载地址:https://www.vmware.com/cn/products/workstation-pro/workstation-pro-evaluatio ...

  5. PyCharm添加Selenium与Appium类库

    PyCharm添加Selenium与Appium依赖, 不需要用pip去安装!

  6. 巧用浏览器F12调试器定位系统前后端bug

    做测试的小伙伴可能用过httpwatch,firebug,fiddler,charles等抓包(数据包)工具,但实际上除了这些还有一个简单实用并的抓包工具,那就是浏览器的F12调试器. httpwat ...

  7. Git命令使用大全

    一前言 最近公司在使用vue和WebAPI前后端分离的项目开发,使用的代码管理工具是git,刚开始使用的时候前端的vue文件还比较好处理,但是后端的C#文件在每一次自己编译之后上传都会和其他小伙伴的代 ...

  8. laravel 的DB::raw() 语法使用

    z之前在项目中遇到一个问题,复杂的sql查询,用laravel的查询构造器,非常的不方便,各种查询条件拼接一长串拼得脑瓜疼:然后想使用原生的sql语句来查询,然后又使用不了laravel的pagina ...

  9. JS原型链与继承别再被问倒了

    原文:详解JS原型链与继承 摘自JavaScript高级程序设计: 继承是OO语言中的一个最为人津津乐道的概念.许多OO语言都支持两种继承方式: 接口继承 和 实现继承 .接口继承只继承方法签名,而实 ...

  10. (转)Shadow Mapping

    原文:丢失,十分抱歉,这篇是在笔记上发现的.SmaEngine 阴影和级联部分是模仿UE的结构设计   This tutorial will cover how to implement shadow ...