题目描述

给出一个n * m的矩阵。让你从中发现一个最大的正方形。使得这样子的正方形在矩阵中出现了至少两次。输出最大正方形的边长。

输入描述:

  1. 第一行两个整数n, m代表矩阵的长和宽;
  2. 接下来n行,每行m个字符(小写字母),表示矩阵;

输出描述:

  1. 输出一个整数表示满足条件的最大正方形的边长。
示例1

输入

  1. 5 10
  2. ljkfghdfas
  3. isdfjksiye
  4. pgljkijlgp
  5. eyisdafdsi
  6. lnpglkfkjl

输出

  1. 3

备注:

  1. 对于30%的数据,n,m100
  2. 对于100%的数据,n,m500

数据还是挺好的,不二分超时,用set超内存。得必须自己写字符串二维hash;

此题是原题,URAL

分析:他一定是满足二分性质的~~~

二维字符串hash,没听说过,其实和子矩阵和类似,就是用了一种数学方法,可以通过相加减得到一个子矩阵的hash值。

先一行一行hash,然后是列,组合起来。

逻辑还是很好写的,可以当做一个小板子。

  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef unsigned long long ull;
  6. const int N = + ,INF = 0x3f3f3f3f;
  7. const int seed = ,Seed = ;
  8.  
  9. char ori[N][N];
  10. ull hash1[N][N],seed_pow[N]; ///row
  11. ull hash2[N][N],Seed_pow[N]; ///col
  12. ull a[N*N];
  13. int n,m;
  14.  
  15. bool check(int k) {
  16. int tot = ;
  17.  
  18. for(int i = k; i <= n; i++)
  19. {
  20. for(int j = k ; j <= m; j++)
  21. {
  22. ull tmp = hash2[i][j] - hash2[i-k][j]*Seed_pow[k] - hash2[i][j-k]*seed_pow[k] + hash2[i-k][j-k]*Seed_pow[k]*seed_pow[k];
  23. a[++tot] = tmp;
  24. }
  25. }
  26.  
  27. sort(a+,a++tot);
  28. for(int i = ; i <= tot - ; i++)
  29. if(a[i]==a[i+]) return true;
  30. return false;
  31.  
  32. }
  33.  
  34. int main()
  35. {
  36. freopen("in.txt","r",stdin);
  37. seed_pow[] = Seed_pow[] = ;
  38. for(int i = ; i < N; i++)
  39. {
  40. seed_pow[i] = seed_pow[i-]*seed;
  41. Seed_pow[i] = Seed_pow[i-]*Seed;
  42. }
  43.  
  44. scanf("%d%d",&n,&m);
  45.  
  46. for(int i = ; i <= n; i++) scanf("%s",ori[i]+);
  47.  
  48. for(int i = ; i <= n; i++)
  49. for(int j = ; j <= m; j++)
  50. hash1[i][j] = hash1[i][j-]*seed + ori[i][j];
  51.  
  52. for(int i = ; i <= m; i++)
  53. for(int j = ; j <= n; j++)
  54. hash2[j][i] = hash2[j-][i]*Seed + hash1[j][i];
  55.  
  56. int ans = ;
  57. int l = ,r = min(n,m);
  58.  
  59. while(l<=r) {
  60. int mid = (l + r) >> ;
  61. if(check(mid)) ans = mid,l = mid + ;
  62. else r = mid - ;
  63. }
  64. printf("%d\n",ans);
  65.  
  66. return ;
  67. }
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld

题目描述

shy有一颗树,树有n个结点。有k种不同颜色的染料给树染色。一个染色方案是合法的,当且仅当对于所有相同颜色的点对(x,y),x到y的路径上的所有点的颜色都要与x和y相同。请统计方案数。

输入描述:

  1. 第一行两个整数nk代表点数和颜色数;
  2. 接下来n-1行,每行两个整数x,y表示xy之间存在一条边;

输出描述:

  1. 输出一个整数表示方案数(mod 1e9+7)。
示例1

输入

  1. 4 3
  2. 1 2
  3. 2 3
  4. 2 4

输出

  1. 39

备注:

  1. 对于30%的数据,n10, k3
  2. 对于100%的数据,n,k300

顿时对牛客上的题目好感+1。

此题看上去是一个染色,其实任意两个相同颜色的点对,之间都的一个颜色,那就是一个联通分量全是一个颜色。

树,就可以看做是一个点集合,挑哪些点染同一种颜色。显然是DP做法。

d[i][j] :前 i 个点,染 j 种颜色的方案数。

d[i][j] = d[i-1][j] + d[i-1][j-1]*(k+1-j);

  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. const int mod = 1e9+;
  6.  
  7. long long d[][];
  8.  
  9. int main()
  10. {
  11. int n,k;
  12. scanf("%d%d",&n,&k);
  13.  
  14. for(int i = ; i < n-; i++) {
  15. int x,y;
  16. scanf("%d%d",&x,&y);
  17. }
  18.  
  19. memset(d,,sizeof(d));
  20. d[][] = ;
  21.  
  22. for(int i = ; i <= n; i++) {
  23. for(int j = ; j <= k; j++) {
  24. d[i][j] = (d[i-][j] + d[i-][j-]*(k+-j))%mod;
  25. }
  26. }
  27.  
  28. long long ans = ;
  29. for(int j = ; j <= k; j++)
  30. ans = (ans + d[n][j])%mod;
  31. cout<<ans<<endl;
  32.  
  33. return ;
  34. }

Wannafly模拟赛的更多相关文章

  1. Wannafly模拟赛5 A Split 暴力 二分加速

    你有一个大小为

  2. Wannafly模拟赛 A.矩阵(二分答案+hash)

    矩阵 时间限制:1秒 空间限制:131072K 题目描述 给出一个n * m的矩阵.让你从中发现一个最大的正方形.使得这样子的正方形在矩阵中出现了至少两次.输出最大正方形的边长. 输入描述: 第一行两 ...

  3. Wannafly模拟赛3

    喜欢想飞啊,毕竟这里的题目还都算挺好的中文题,不过做英文题久了还是感觉英文题更好理解一点 反蝴蝶效应 时间限制:1秒 空间限制:65536K 题目描述 一只南美洲亚马孙河流域热带雨林中的蝴蝶,偶尔扇动 ...

  4. Wannafly模拟赛2

    Contest 时间限制:1秒 空间限制:131072K 题目描述 n支队伍一共参加了三场比赛. 一支队伍x认为自己比另一支队伍y强当且仅当x在至少一场比赛中比y的排名高. 求有多少组(x,y),使得 ...

  5. 牛客网Wannafly模拟赛

    A矩阵 时间限制:1秒 空间限制:131072K 题目描述 给出一个n * m的矩阵.让你从中发现一个最大的正方形.使得这样子的正方形在矩阵中出现了至少两次.输出最大正方形的边长. 输入描述: 第一行 ...

  6. Wannafly模拟赛2 B river(拉格朗日乘数法)

    题目 https://www.nowcoder.com/acm/contest/4/B题意 有n条南北流向的河并列排着,水流速度是v,现在你需要从西岸游到东岸,总共T个时间,你的游泳速度是u,问东岸的 ...

  7. Wannafly模拟赛2 C alliances(dfs序+二分)

    题目 https://www.nowcoder.com/acm/contest/4/C 题意 由n个点组成一个树,有m个帮派,每个帮派由一些个点组成,这些点以及它们两两路径上的所有点都属于该帮派的管辖 ...

  8. Wannafly交流赛1_B_硬币【数学】

    Wannafly交流赛1_B_硬币[数学] 链接:https://www.nowcoder.com/acm/contest/69/B 来源:牛客网 题目描述 蜥蜴的生日快到了,就在这个月底! 今年,蜥 ...

  9. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

随机推荐

  1. PIE SDK聚类

    1.算法功能简介 聚类处理时运用形态学算子将临近的类似分类区域聚类并合并. PIE SDK支持算法功能的执行,下面对聚类算法功能进行介绍. 2.算法功能实现说明 2.1. 实现步骤 第一步 算法参数设 ...

  2. Unity 修改windows窗口的标题

    修改windows窗口的标题名称,就是修改下图的东西: 第一种: using UnityEngine; using System; using System.Runtime.InteropServic ...

  3. windows 系统 python3.5安装 lxml 库

    有个提示uable find vc***,的错误,如果按照修改python脚本的方法会发现还需要安装VS,安装好了还不一定可以解决问题. 费了半天劲,结合网络上部分信息终于找到了解决方案: 1.打开文 ...

  4. (转)shell脚本之seq命令

    shell脚本之seq命令 原文:http://blog.csdn.net/paoxiaohui/article/details/52830595 seq 用于生成从一个数到另一个数之间的所有整数. ...

  5. spark运行时出现Neither spark.yarn.jars nor spark.yarn.archive is set错误的解决办法(图文详解)

    不多说,直接上干货! 福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师      人工智能躺过的坑          ...

  6. oracle客户端中文乱码问题的解决

    1 查看服务器端编码 select userenv('language') from dual; 我实际查看到的结果为: USERENV('LANGUAGE') ------------------- ...

  7. 机器学习——GBDT

    基础概念 GBDT(Gradient Boosting Decision Tree) 全称梯度提升决策树,是一种迭代的决策树算法.GBDT是集成学习Boosting的家族成员,GBDT中的树是回归树, ...

  8. [转]解读ASP.NET 5 & MVC6系列(8):Session与Caching

    本文转自:http://www.cnblogs.com/TomXu/p/4496445.html 在之前的版本中,Session存在于System.Web中,新版ASP.NET 5中由于不在依赖于Sy ...

  9. hadoop 天气案例

    对下面一组气温数据进行处理,得到每个月份最高的两个气温值 2018-12-12 14:30 25c2018-12-12 15:30 26c2017-12-12 12:30 36c2019-01-01 ...

  10. LaTeX 修订

    LaTeX多人协同编辑的时候,修订起来与word相比较而言麻烦一些.不过随着技术的发展和需求的增多,会有越来越多的工具支持LaTeX的修订. (1)在线LaTeX ShareLaTeX是一个很优秀的在 ...