bzoj1125:[POI2008]Poc
传送门
这个题好难卡啊。
看到这种题自然会想到字符串hash是不是,但是对于每次操作造成的影响需要\(O(n)\)的时间去更新,自然是不优的
可以发现这个更新可以用数据结构来维护,对于每个hash值开一颗线段树之类的支持区间修改的数据结构
然后就可以愉快的解决了
注意:
1、hash值请使用map和unsigned long long存,否则会产生冲突
2、特判a==c的情况
3、map是真的慢,请不要在无\(O(2)\)情况下使用
代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
void read(int &x) {
char ch; bool ok;
for(ok=0,ch=getchar(); !isdigit(ch); ch=getchar()) if(ch=='-') ok=1;
for(x=0; isdigit(ch); x=x*10+ch-'0',ch=getchar()); if(ok) x=-x;
}
#define rg register
#define ull unsigned
const int maxn=1e3+10,k=233,mod=1e5+7;
int n,l,m,id,now,ans[maxn],la[mod*20],ls[mod*20],rs[mod*20];char ch[maxn][110];
bool vis[mod*20];
struct oo
{
void update(int x){vis[x]=vis[ls[x]]|vis[rs[x]];}
void pushdown(int x)
{
if(vis[ls[x]])la[ls[x]]=max(la[ls[x]],la[x]);
if(vis[rs[x]])la[rs[x]]=max(la[rs[x]],la[x]);
la[x]=0;
}
void add(int &k,int l,int r,int a,int b)
{
if(!k)k=++id;int mid=(l+r)>>1;
if(l==r){ans[l]=max(ans[l],la[k]);vis[k]=b==1;return ;}
if(la[k])pushdown(k);
if(a<=mid)add(ls[k],l,mid,a,b);
else add(rs[k],mid+1,r,a,b);
update(k);
}
int get(int x,int l,int r,int a)
{
int mid=(l+r)>>1;
if(l==r)return max(ans[l],la[x]);if(la[x])pushdown(x);
if(a<=mid)return get(ls[x],l,mid,a);
else return get(rs[x],mid+1,r,a);
}
};
map<ull,oo>h;
map<int,ull>w,ny;
map<ull,int>sum,rt;
int main()
{
read(n),read(l),read(m);
for(rg int i=1;i<=n;i++)scanf("%s",ch[i]+1);ny[0]=1;
for(rg int i=1;i<=l;i++)ny[i]=ny[i-1]*k;
for(rg int i=1;i<=n;i++)
{
ull now=0;
for(rg int j=1;j<=l;j++)now=now*k+ch[i][j]-'a';
w[i]=now,h[now].add(rt[now],1,n,i,1),sum[now]++,la[rt[now]]=max(la[rt[now]],sum[now]);
}
for(rg int i=1,a,b,c,d;i<=m;i++)
{
read(a),read(b),read(c),read(d);swap(ch[a][b],ch[c][d]);
if(a!=c)
{
h[w[a]].add(rt[w[a]],1,n,a,-1),h[w[c]].add(rt[w[c]],1,n,c,-1),sum[w[a]]--,sum[w[c]]--;
w[a]=w[a]+(ch[a][b]-ch[c][d])*ny[l-b],w[c]=w[c]+(ch[c][d]-ch[a][b])*ny[l-d];
h[w[a]].add(rt[w[a]],1,n,a,1),sum[w[a]]++,la[rt[w[a]]]=max(la[rt[w[a]]],sum[w[a]]);
h[w[c]].add(rt[w[c]],1,n,c,1),sum[w[c]]++,la[rt[w[c]]]=max(la[rt[w[c]]],sum[w[c]]);
}
else
{
h[w[a]].add(rt[w[a]],1,n,a,-1),h[w[c]].add(rt[w[c]],1,n,c,-1),sum[w[a]]--;
w[a]=w[a]+(ch[a][b]-ch[c][d])*ny[l-b],w[c]=w[c]+(ch[c][d]-ch[a][b])*ny[l-d];
h[w[a]].add(rt[w[a]],1,n,a,1),sum[w[a]]++,la[rt[w[a]]]=max(la[rt[w[a]]],sum[w[a]]);
}
}
for(rg int i=1;i<=n;i++)printf("%d\n",h[w[i]].get(rt[w[i]],1,n,i));
}
bzoj1125:[POI2008]Poc的更多相关文章
- 【BZOJ1125】[POI2008]Poc hash+map+SBT
[BZOJ1125][POI2008]Poc Description n列火车,每条有l节车厢.每节车厢有一种颜色(用小写字母表示).有m次车厢交换操作.求:对于每列火车,在交换车厢的某个时刻,与其颜 ...
- [POI2008] Poc (原名 Trians) Treap+Hash
这个题和千山鸟飞绝体现出了一种用平衡树解决动态集合问题,主要套路就是蜜汁标记. 这个题我一开始用替罪羊树搞了一下对了28个点,后来我换成了Treap一搞对了14个点,再后来发现被卡了Hash我竟然在自 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 【BZOJ1125】【POI2008】poc - splay+哈希
题意: Description n列火车,每条有l节车厢.每节车厢有一种颜色(用小写字母表示).有m次车厢交换操作.求:对于每列火车,在交换车厢的某个时刻,与其颜色完全相同的火车最多有多少. Inpu ...
- [POI2008]KLO && POC
题意:给定一个序列 s1, s2,...sn,以及一个k,求一个连续的k个数,把s[i]...s[i+k-1]变成一个数s',使得sigma(|s[j]-s'|)(i<=j<=i+k-1) ...
- [BZOJ1112][POI2008]砖块Klo
[BZOJ1112][POI2008]砖块Klo 试题描述 N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖,放到另 ...
- Struts2批量验证(POC)
only poc , 再据结果利用EXP进一步测试: 支持 -u 单个url; -f 文本批量URL导入 url列表格式是https://www.baidu.com #! /usr/bin/env p ...
- [bzoj1122][POI2008]账本BBB
1122: [POI2008]账本BBB Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 402 Solved: 202[Submit][Status ...
- [手机取证] Jonathan Zdziarski公开的苹果iOS后门及POC视频
Jonathan Zdziarski 近日在其推特上公布了此“后门”的研究及POC视频,并表示全球媒体“夸大”了此事,自己“从未表示过认为此后门与NSA的监控行为有关”. 视频 http://pan. ...
随机推荐
- Node中的Socket.IO 简单Demo及说明
注:下面Demo的Server和Client都是纯后端. 并没有web页面. Server端代码: var express = require('express'); var app = expres ...
- 阿里妈妈-RAP项目的实践(2)
接口详情 (id: 32872) Mock数据 接口名称 datalist1 请求类型 get 请求Url /datas/list1 接口描述 数据列表 请求参数列表 变量名 含义 类型 备注 响应参 ...
- appium(13)- server config
//本文讲解:启动server时,如何配置capabilities 和 flag.可以将不同client端需要的通用的capabilities都放到server端配置. Requirements In ...
- hibernate属性配置
数据库中一个字段的默认值设为0,当用hibernate插入数据时,没有对该字段进行操作,结果该字段居然不是0,而是空.后来google了一下,发现应该在.hbm.xml文件中添加一些参数定义(示例中的 ...
- linux iptables:安全应用,防火墙
iptables:安全应用,防火墙 windows和linux都有防火墙,企业的边缘会部署防火墙保证企业内部的局域网是安全的.针对个人电脑会有防火墙保证系统是安全的. 防火墙是唯一通道. 防火墙分类( ...
- css position弹性盒子测试
总结: 1.利用样式height:100%设置div高度为全屏时候必须设置所有的父元素,但是父元素那么多,不可控,所以此法不可行: 2.设置父框架的padding为100px,div进行float,p ...
- Linux启动eclipse报错找不到java环境解决方法
在Linux mint下,前几天还用得很好的的eclipse,今天开机不知为什么这样. Eclipse 3.6 在 linux mint 12 可以在终端顺利启动Eclipse,但是鼠标双击,或者用起 ...
- Java--23种设计模式之decorator模式
装饰模式:装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,提供比继承更多的灵活性.动态给一个对象增加功能,这些功能可以再动态的撤消.增加由一些基本功能的排列组合而产生的非常大量的 ...
- Log4j1的使用与log4j.properties的配置
这里介绍Log4j1(即Log4j 1.x版本),这里以普通的Java项目为例,用eclipse编写,项目结构如下图所示: 该项目主要包括: java文件:Log4jv1Util 以及 Log4jv1 ...
- many-to-one 配置问题
需要引入org.hibernate.annotations.NotFound,当预期的被关联的元素不在数据库(关乎关联列的错误id)时,致使Hibernate无法解决关联性问题时,Hibernate就 ...