A.矩阵

题目链接:https://www.nowcoder.com/acm/contest/submit/f8363c912a4c48a28b80f47e7102b6b8?ACMContestId=2&tagId=4

题目意思:这个题目是中文就不加解释了,首先这个子矩阵,就说明这个矩阵是实心的,并不是只是一个框,所以为什么我强调这点呢?因为比赛的时候我傻逼了,唉,心痛。

题目思路:二维哈希+二分

  之前没学过哈希,所以第一次遇到就碰到二维的哈希qwq,首先哈希就是为了把一个字符串通过一个基数(一般是素数)把他压缩成一个值,冲突的概率极小,所以我们可以很方便的通过一个值来比较两个字符串是否相同,这是一维的哈希,如果是二维的哈希呢?没错我们需要两个基数,我们可以把一个字符串压成一个值,那么对于一系列由字符串压成的值再通过一个基数压成一个新的值,这样这个值就代表一个矩阵了。接下来再次附上我的灵魂画作

如上图所示,[0,r]这个区间的字符串所压缩成的哈希值实际上是储存在下标为数组中r+1的格子里面。所以实际上每个下标为n的格子实际上储存了[0,n)这个左闭右开区间内部的哈希值,那么如果我们要的到某个区间的哈希值呢?我们来举一个例子,我们假设一个字符串是1234567,我们设基数为10(十进制方便理解),我们把这个情况画出来

比如现在我们想要得到区间在字符串中区间为[3,5]的哈希值,或者说从3开始长度为(5-3+1)的区间的哈希值(如果是[3,6)就是(6-3)),就是123456-123000=456,也就是说如果是区间

[L,R)我们可以通过hash_get(L,R-L)来获取哈希值,如果是[L,R],我们可以通过hash_get(L,R-L+1)来获得哈希值,想要得到哈希值我们需要预处理基数的次方表。

那么对于二维哈希表来说其实也一样,也是一样,这里就不做多余的说明。

然后就是二分,记住最大值最小化二分时终点是mid=(L+R+1)/2;否则会死循环。

代码:

 //Author: xiaowuga
#include <bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define MAX INT_MAX
#define mem(s,ch) memset(s,ch,sizeof(s))
const long long N=;
const long long mod=1e9+;
typedef long long LL;
typedef int II;
typedef unsigned long long ull;
#define nc cout<<"nc"<<endl
#define sp " "
ull p1=,p2=;
ull x1[N],x2[N];
vector<string>a;
II n,m;
ull Hash[N][N];
void init(){
x1[]=;x2[]=;
for(II i=;i<;i++){
x1[i]=x1[i-]*p1;
x2[i]=x2[i-]*p2;
}
}
void hash_init(){
mem(Hash,);
for(II i=;i<=n;i++){
for(II j=;j<=m;j++){
Hash[i][j]=Hash[i][j-]*p1+a[i-][j-]-'a'+;
}
}
for(II j=;j<=m;j++){
for(II i=;i<=n;i++){
Hash[i][j]=Hash[i-][j]*p2+Hash[i][j];
}
}
}
ull Hash_get(II x,II y,II l){
ull ans=Hash[x+l][y+l]-Hash[x][y+l]*x2[l];
ull res=Hash[x+l][y]-Hash[x][y]*x2[l];
return ans-res*x1[l];
}
bool OK(II k){
if(!k) return false;
unordered_set<ull>q;
for(II i=;i+k<=n;i++){
for(II j=;j+k<=m;j++){
ull ans=Hash_get(i,j,k);
if(q.find(ans)!=q.end()) return true;
else q.insert(ans);
}
}
return false;
}
int main() {
ios::sync_with_stdio(false);cin.tie();
init();
while(cin>>n>>m){
a.resize(n);
for(II i=;i<n;i++) cin>>a[i];
hash_init();
II l=,r=min(n,m)+;
while(l<r){
II mid=l+(r-l+)/;
if(OK(mid)) l=mid;
else r=mid-;
}
if(OK(l)) cout<<l<<endl;
else cout<<<<endl;
}
return ;
}

B.树

题目链接:https://www.nowcoder.com/acm/contest/submit/86fc8c46a8ce4c1fba763b8cf311f805?ACMContestId=2&tagId=4

题目意思:一颗树,现在有k种颜色,给n个节点染色,要求同样颜色的节点直接是可以互通的,问有多少种染色方法。

题目思路:很简单,如果同样颜色的节点可以互通,这个同样颜色的连通块必定是以这个区间内某个点为根的子树,我们可以发现一颗树每去掉一条边就是会多出一个连通块,那么发现我们去掉n-1条边中选择0条边形成一个连通块,k种颜色里面选择一种,也就是C(n-1,0)*A(k,1),,然后n-1条边里去掉一条边形成两个连通块,k中颜色里面选择两种那么就是

C(n-1,1)*A(k,2),依次类推,后面的就不多做赘述,我们可以惊奇的发现貌似和树的形态没有任何关系,就是没有关系,真是太坑爹了。

代码:(处理大组合数和阶乘数的姿势就不做赘述了)

 //Author: xiaowuga
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
#include <queue>
#include <cmath>
#include <cstring>
#include <cstdio>
#include <ctime>
#include <map>
#include <bitset>
#include <stack>
#include <cctype>
#define maxx INT_MAX
#define minn INT_MIN
#define inf 0x3f3f3f3f
#define mem(s,ch) memset(s,ch,sizeof(s))
#define nc cout<<"nc"<<endl
#define sp " "
const long long N=;
const long long mod=1e9+;
using namespace std;
typedef long long LL;
typedef int II;
II n,k;
vector<int>pr[N];
LL p[N][N]={};
LL A[N];
void init(){
for(int i=;i<=;i++) p[i][]=;
for(int i=;i<=;i++)
for(int j=;j<=i;j++){
p[i][j]=(p[i-][j]+p[i-][j-])%mod;
}
A[]=;A[]=;
for(II i=;i<N;i++) A[i]=A[i-]*i%mod;
}
int main() {
ios::sync_with_stdio(false);cin.tie();
init();
while(cin>>n>>k){
for(II i=;i<=n;i++) pr[i].clear();
for(II i=;i<n-;i++){
II x,y;cin>>x>>y;
pr[x].push_back(y);pr[y].push_back(x);
}
if(k==){cout<<<<endl;continue;}
LL ans=;
LL li=min(n-,k-);
for(II i=;i<=li;i++){
LL tmp=p[k][i+]*A[i+]%mod;
LL t=p[n-][i]*tmp%mod;
ans=(ans+t)%mod;
}
cout<<ans<<endl;
}
return ;
}

牛客网_Wannafly模拟赛1的更多相关文章

  1. 10.6-10.7 牛客网NOIP模拟赛题解

    留个坑... upd:估计这个坑补不了了 如果还补不了就删了吧

  2. 牛客网Wannafly模拟赛

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

  3. 牛客网多校赛第9场 E-Music Game【概率期望】【逆元】

    链接:https://www.nowcoder.com/acm/contest/147/E 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...

  4. 牛客网-湘潭大学校赛重现H题 (线段树 染色问题)

    链接:https://www.nowcoder.com/acm/contest/105/H来源:牛客网 n个桶按顺序排列,我们用1~n给桶标号.有两种操作: 1 l r c 区间[l,r]中的每个桶中 ...

  5. 牛客网多校赛第九场A-circulant matrix【数论】

    链接:https://www.nowcoder.com/acm/contest/147/A 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...

  6. 牛客网多校赛第七场J--Sudoku Subrectangle

    链接:https://www.nowcoder.com/acm/contest/145/J 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言6553 ...

  7. 牛客网多校赛第七场--C Bit Compression【位运算】【暴力】

    链接:https://www.nowcoder.com/acm/contest/145/C 来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言524 ...

  8. 牛客网多校赛第七场A--Minimum Cost Perfect Matching【位运算】【规律】

    链接:https://www.nowcoder.com/acm/contest/145/A 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...

  9. nowcoder(牛客网)OI测试赛3 解题报告

    昨天因为胡搞了一会儿社团的事情,所以错过(逃过)了nowcoder的测试赛..... 以上,听说还是普及组难度qwq,而且还有很多大佬AK(然而我这么蒻肯定还是觉得有点难度的吧qwq) 不过我还是日常 ...

随机推荐

  1. vim列编辑模式快捷键

    vi/vim编辑器 多行行首插入   1 在多行行首插入,在nomal模式下按下ctrl+v,然后进行选择(如果想要选择至文件结尾,则再按G) 2 选择好以后按大写的I,则光标会自动跳转到所选择行的第 ...

  2. nginx 反向代理 配置 https 实现http https同时存在 经测试 支持location 规则

    server { listen ssl; #监听443端口 server_name www.app01.com; ssl on; #启用ssl加密 ssl_certificate /etc/cert/ ...

  3. struts2防止表单重复提交的解决方案

    一.造成重复提交主要的两个原因:    在平时的开发过程中,经常可以遇到表单重复提交的问题,如做一个注册页面,如果表单重复提交,那么一个用户就会注册多次,重复提交主要由于两种原因. 1. 一是,服务器 ...

  4. 解决VisualStudio2013无法查看数组内容的问题

    症状: 在使用VS2013调试的时候,数组只能查看第一个元素的值.如图 解决方案: 调试>窗口>内存 输入数组的内存地址,右击内存窗口>带符号显示(也可以选择16进制显示,看你自己的 ...

  5. 开启Visual Studio 2013时,出现Microsoft.VisualStudio.Web.PasteJson.JsonPackage无法载入的可能解決方案

    1.先下载:http://www.jb51.net/dll/Microsoft.VisualStudio.Web.PasteJson.dll.html Microsoft.VisualStudio.W ...

  6. UCOS2系统内核讲述(三)_TCB任务控制块

    Ⅰ.写在前面 学习本文之前可以参看我前面的文章: UCOS2_STM32F1移植详细过程(汇总文章) UCOS2系统内核讲述(一)_总体描述 UCOS2系统内核讲述(二)_初始化调用函数 上一篇文章讲 ...

  7. 机器学习:如何通过Python入门机器学习

    我们都知道机器学习是一门综合性极强的研究课题,对数学知识要求很高.因此,对于非学术研究专业的程序员,如果希望能入门机器学习,最好的方向还是从实践触发. 我了解到Python的生态对入门机器学习很有帮助 ...

  8. Android基础总结(十)ContentProvider

    内容提供者(掌握) 应用的数据库是不允许其他应用访问的 内容提供者的作用就是让别的应用访问到你的私有数据 自定义内容提供者,继承ContentProvider类,重写增删改查方法,在方法中写增删改查数 ...

  9. java调用kettle_实现(2)

    (1).参照“java调用kettle_导入jar包(1)”,应用etl工具下lib里的所有jar (2). 最近要对一个系统的数据同步到另一个系统中,要求新系统的数据结果完成之后,实时同步到另一个系 ...

  10. 2015 Multi-University Training Contest 3 1001 Magician

    Magician Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5316 Mean: n个数,2种操作,1是单点更新,2是询问区间 ...