KMP暴力求出next数组后
实际上是一个最短路问题,floyed搞一搞
然而会TLE
矩阵优化一下即可(倍增floyed)
KMP在弱数据下可以AC。。正解请看其他人博客

  1. # include <stdio.h>
  2. # include <stdlib.h>
  3. # include <iostream>
  4. # include <algorithm>
  5. # include <string.h>
  6. # define IL inline
  7. # define RG register
  8. # define Fill(a, b) memset(a, b, sizeof(a))
  9. using namespace std;
  10. typedef long long ll;
  11. IL ll Read(){
  12. RG char c = getchar(); RG ll x = 0, z = 1;
  13. for(; c < '0' || c > '9'; c = getchar()) z = c == '-' ? -1 : 1;
  14. for(; c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) + c - '0';
  15. return x * z;
  16. }
  17. int n, m, nxt[210][100010], len[210];
  18. char s[210][100010];
  19. struct Matrix{
  20. ll a[210][210];
  21. IL void Clear(){ Fill(a, 63); }
  22. IL ll* operator [](RG int x){ return a[x]; }
  23. IL Matrix operator *(RG Matrix &B){
  24. RG Matrix C; C.Clear();
  25. for(RG int i = 0; i <= n; i++)
  26. for(RG int j = 0; j <= n; j++)
  27. for(RG int k = 0; k <= n; k++)
  28. C[i][k] = min(C[i][k], a[i][j] + B[j][k]);
  29. return C;
  30. }
  31. } ans, edge;
  32. int main(RG int argc, RG char* argv[]){
  33. edge.Clear(); ans.Clear();
  34. n = Read(); m = Read();
  35. for(RG int i = 1; i <= n; i++)
  36. scanf(" %s", s[i] + 1), len[i] = strlen(s[i] + 1);
  37. for(RG int k = 1; k <= n; k++)
  38. for(RG int i = 2, j = 0; i <= len[k]; i++){
  39. while(j && s[k][j + 1] != s[k][i]) j = nxt[k][j];
  40. if(s[k][j + 1] == s[k][i]) j++;
  41. nxt[k][i] = j;
  42. }
  43. for(RG int x = 1; x <= n; x++){
  44. edge[0][x] = len[x];
  45. for(RG int y = 1; y <= n; y++)
  46. for(RG int i = 2, j = 0; i <= len[x]; i++){
  47. while(j && s[y][j + 1] != s[x][i]) j = nxt[y][j];
  48. if(s[y][j + 1] == s[x][i]) j++;
  49. if(i == len[x]) edge[x][y] = len[y] - j;
  50. }
  51. }
  52. for(RG int i = 0; i <= n; i++) ans[i][i] = 0;
  53. for(; m; m >>= 1, edge = edge * edge) if(m & 1) ans = ans * edge;
  54. RG ll min_len = 1e18;
  55. for(RG int i = 1; i <= n; i++) min_len = min(ans[0][i], min_len);
  56. printf("%lld\n", min_len);
  57. return 0;
  58. }

[POI2010]CHO-Hamsters的更多相关文章

  1. [poi2010]Hamsters

    题意:Tz养了一群仓鼠,他们都有英文小写的名字,现在Tz想用一个字母序列来表示他们的名字,只要他们的名字是字母序列中的一个子串就算,出现多次可以重复计算.现在Tz想好了要出现多少个名字,请你求出最短的 ...

  2. 安徽师大附中%你赛day6 T3 Hamsters [POI2010]CHO-Hamsters 解题报告

    [POI2010]CHO-Hamsters 题意: 给出n个互不包含的字符串,要求你求出一个最短的字符串S,使得这n个字符串在S中总共至少出现m次,问S最短是多少? 范围: \(1 \le n \le ...

  3. BZOJ2085 : [Poi2010]Hamsters

    设g[i][j]为i串至少加上几个字符后才能包含j,可以通过Hash求出. 然后就是求经过m-1条边的最短路,用倍增加速Floyed即可,时间复杂度$O(n^3\log m)$. #include&l ...

  4. 【bzoj2085】[Poi2010]Hamsters Hash+倍增Floyd

    题目描述 Tz养了一群仓鼠,他们都有英文小写的名字,现在Tz想用一个字母序列来表示他们的名字,只要他们的名字是字母序列中的一个子串就算,出现多次可以重复计算.现在Tz想好了要出现多少个名字,请你求出最 ...

  5. BZOJ 2085 [POI2010] Hamsters

    题面 Description Tz养了一群仓鼠,他们都有英文小写的名字,现在Tz想用一个字母序列来表示他们的名字,只要他们的名字是字母序列中的一个子串就算,出现多次可以重复计算.现在Tz想好了要出现多 ...

  6. BZOJ 2085 luogu P3502 [POI2010]Hamsters (KMP、Floyd、倍增)

    数组开小毁一生-- 题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2085 这题在洛谷上有个条件是"互不包含",其实 ...

  7. bzoj2085 [Poi2010]Hamsters 矩阵快速幂+字符串hash

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2085 题解 考虑暴力 DP 的做法.令 \(dp[i][j]\) 表示以 \(j\) 为开头的 ...

  8. BZOJ 2080: [Poi2010]Railway 双栈排序

    2080: [Poi2010]Railway Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 140  Solved: 35[Submit][Statu ...

  9. 【BZOJ】【2084】【POI2010】Antisymmetry

    Manacher算法 啊……Manacher修改一下就好啦~蛮水的…… Manacher原本是找首尾相同的子串,即回文串,我们这里是要找对应位置不同的“反回文串”(反对称?233) 长度为奇数的肯定不 ...

  10. BZOJ2086: [Poi2010]Blocks

    题解: 想了想发现只需要求出最长的一段平均值>k即可. 平均值的问题给每个数减去k,判断是否连续的一段>0即可. 然后我们发现如果i<j 且 s[i]<s[j],那么 j 对于 ...

随机推荐

  1. 分享:Python中的位运算符

    按位运算符是把数字看作二进制来进行计算的.用的不太多,简单了解. 下表中变量 a 为 60,b 为 13二进制格式如下: a = 0011 1100 b = 0000 1101 a&b = 0 ...

  2. PHP安全、Sql防注入安全汇总

    利用Mysqli和PDO 产生原因 主要就是一些数据没有经过严格的验证,然后直接拼接 SQL 去查询.导致漏洞产生,比如: $id = $_GET['id']; $sql = "SELECT ...

  3. Android ADB Server启动失败

    启动Android Stdio的时候报如下错误: Unable to create Debug Bridge: Unable to start adb server: error: could not ...

  4. zoj 3962 Seven Segment Display 数位dp

    非常好的一个题,可以比赛时想到的状态太奇葩,不方便转移,就一直没能AC. 思路:dp(i, j)表示已经考虑了前i位,前i位的和为j的贡献.如果当前的选择一直是最大的选择,那么就必须从0~下一位的最大 ...

  5. 将DataSet转化成XML格式的String类型,再转化回来。

    /// <summary> /// 获取DataSet的Xml格式 /// </summary> public static string GetDataSetXml(this ...

  6. BZOJ 2429: [HAOI2006]聪明的猴子

    Description 在一个热带雨林中生存着一群猴子,它们以树上的果子为生.昨天下了一场大雨,现在雨过天晴,但整个雨林的地 表还是被大水淹没着,部分植物的树冠露在水面上.猴子不会游泳,但跳跃能力比较 ...

  7. Angularjs的真分页,服务端分页,后台分页的解决方案

    背景:项目的框架使用的是Angularjs,在做数据展示的时候,使用的是ng-table.用过ng-table的人都知道,他是自带分页的,默认分页方式是假分页.也就是一口气把所有的数据从数据库里取出来 ...

  8. linux系统 initrd.img中init启动脚本分析

    概述:这篇文章主体内容来源于网上转载.前面几篇文章倾向于制作initrd.img,这篇文章更倾向于initrd.img的运行过程:加载framebuff驱动 ide驱动和文件系统驱动,最后进入到真正的 ...

  9. NLP︱LDA主题模型的应用难题、使用心得及从多元统计角度剖析

    将LDA跟多元统计分析结合起来看,那么LDA中的主题就像词主成分,其把主成分-样本之间的关系说清楚了.多元学的时候聚类分为Q型聚类.R型聚类以及主成分分析.R型聚类.主成分分析针对变量,Q型聚类针对样 ...

  10. Ubuntu 卸载cario-dock

    偶然间听说别人用dock 可以把ubuntu美化,结果就装了个cairo-dock .结果是苹果mac的风格.不是很喜欢.于是就卸载,卸载过程中.发行卸载不掉. 尝试了很多方法. sudo apt-g ...