传送门

这个题好难卡啊。

看到这种题自然会想到字符串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的更多相关文章

  1. 【BZOJ1125】[POI2008]Poc hash+map+SBT

    [BZOJ1125][POI2008]Poc Description n列火车,每条有l节车厢.每节车厢有一种颜色(用小写字母表示).有m次车厢交换操作.求:对于每列火车,在交换车厢的某个时刻,与其颜 ...

  2. [POI2008] Poc (原名 Trians) Treap+Hash

    这个题和千山鸟飞绝体现出了一种用平衡树解决动态集合问题,主要套路就是蜜汁标记. 这个题我一开始用替罪羊树搞了一下对了28个点,后来我换成了Treap一搞对了14个点,再后来发现被卡了Hash我竟然在自 ...

  3. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  4. 【BZOJ1125】【POI2008】poc - splay+哈希

    题意: Description n列火车,每条有l节车厢.每节车厢有一种颜色(用小写字母表示).有m次车厢交换操作.求:对于每列火车,在交换车厢的某个时刻,与其颜色完全相同的火车最多有多少. Inpu ...

  5. [POI2008]KLO && POC

    题意:给定一个序列 s1, s2,...sn,以及一个k,求一个连续的k个数,把s[i]...s[i+k-1]变成一个数s',使得sigma(|s[j]-s'|)(i<=j<=i+k-1) ...

  6. [BZOJ1112][POI2008]砖块Klo

    [BZOJ1112][POI2008]砖块Klo 试题描述 N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖,放到另 ...

  7. Struts2批量验证(POC)

    only poc , 再据结果利用EXP进一步测试: 支持 -u 单个url; -f 文本批量URL导入 url列表格式是https://www.baidu.com #! /usr/bin/env p ...

  8. [bzoj1122][POI2008]账本BBB

    1122: [POI2008]账本BBB Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 402  Solved: 202[Submit][Status ...

  9. [手机取证] Jonathan Zdziarski公开的苹果iOS后门及POC视频

    Jonathan Zdziarski 近日在其推特上公布了此“后门”的研究及POC视频,并表示全球媒体“夸大”了此事,自己“从未表示过认为此后门与NSA的监控行为有关”. 视频 http://pan. ...

随机推荐

  1. linux vsftpd

    FTP是CS架构的.使用的是ftp协议. root@ubuntu:/# apt install vsftpd root@ubuntu:/# service vsftpd status ● vsftpd ...

  2. 关于mybatis的学习笔记

    配置文件 贴出mybatis的配置文件,这里mybatis还未与spring做整合: <?xml version="1.0" encoding="UTF-8&quo ...

  3. Codeforces Round #364 (Div. 1)(vp) 没什么题解就留坑待填

    我就做了前两题,第一题第一次vp就把我搞自闭跑路了,第二题第二次又把我搞自闭了 A. As Fast As Possible 细节题 #include<cstdio> #include&l ...

  4. H5与native有啥区别?

    app测试,H5与native有啥区别? native是使用原生系统内核的,相当于直接在系统上操作.是我们传统意义上的软件,更加稳定. 但是H5的APP先得调用系统的浏览器内核,相当于是在网页中进行操 ...

  5. 数学题--On Sum of Fractions

    题目链接 题目意思: 定义v(n)是不超过n的最大素数, u(n)是大于n的最小素数. 以分数形式"p/q"输出 sigma(i = 2 to n) (1 / (v(i)*u(i) ...

  6. python中的不可变类型和可变类型

    在python中整形,字符串,元组是不可变类型,而列表和字典都是可变类型. 对于不可变类型进行重新赋值,相当于是用以前的变量名重新指向了新的地址,这个地址中存的变量值就是重新的赋值 通过python中 ...

  7. Python: PS 图像特效 — 模糊玻璃

    今天介绍一种基于高斯滤波和邻域随机采样,生成一种毛玻璃的图像特效,简单来说,就是先对图像做高斯滤波模糊,然后对模糊后的图像,通过对邻域的随机采样来赋予当前的像素点,这样,生成的图像有有一定的随机扰动和 ...

  8. BZOJ_3729_Gty的游戏_博弈论+splay+dfs序

    BZOJ_3729_Gty的游戏_博弈论+splay+dfs序 Description 某一天gty在与他的妹子玩游戏. 妹子提出一个游戏,给定一棵有根树,每个节点有一些石子,每次可以将不多于L的石子 ...

  9. 万径人踪灭(FFT+manacher)

    传送门 这题--我觉得像我这样的菜鸡选手难以想出来-- 题目要求求出一些子序列,使得其关于某个位置是对称的,而且不能是连续一段,求这样的子序列的个数.这个直接求很困难,但是我们可以先求出所有关于某个位 ...

  10. Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.