题解【语文1(chin1)- 理理思维】
喵~珂朵莉树AC
珂朵莉树?见此处~
这数据结构太暴力了,所以不讲了
Code:
#include<iostream>
#include<cstdio>
#include<vector>
#include<stack>
#include<algorithm>
#include<set>
#include<cctype>
#include<cstring>
using namespace std ;
inline void read(int &x) {
char ch=getchar();
int s=0,f=1;
while (!(ch>='0'&&ch<='9')) {
if (ch=='-') f=-1;
ch=getchar();
}
while (ch>='0'&&ch<='9') {
s=(s<<3)+(s<<1)+ch-'0';
ch=getchar();
}
x=s*f;
}
#define ITer set<node>::iterator
namespace odt{
struct node{
mutable char v ;
int l , r ;
node(int Ll,int Rr=-1,char Vv=0): l(Ll) , r(Rr) , v(Vv){}
bool operator < (node n)const{
return l<n.l ;
}
} ;
set<node> s ;
ITer split(int pos){
ITer it = s.lower_bound(node(pos)) ;
if(it!=s.end() && it->l == pos) return it ;
--it ; int L = it->l , R = it->r ; char V = it->v ;
s.erase(it) ;
s.insert(node(L,pos-1,V)) ;
return s.insert(node(pos,R,V)).first ;
}
void assign_val(int x,int y,char val=0){
val = tolower(val) ;
ITer yv = split(y+1) , xv = split(x) ;
s.erase(xv,yv) ;
s.insert(node(x,y,val)) ;
}
int query(int x,int y,char k){
k = tolower(k) ;
int ans = 0 ;
ITer yv = split(y+1) , xv = split(x) ;
for(;xv!=yv;++xv) if(xv->v==k) ans+=xv->r-xv->l+1 ;
return ans ;
}
void st(int x,int y){
int ton[257] ;
memset(ton,0,sizeof(ton)) ;
ITer yv = split(y+1) , xv = split(x) ;
ITer it = xv ;
for(;xv!=yv;++xv) ton[xv->v] += xv->r-xv->l+1;
s.erase(it,yv) ;
for(int i=0;i<='z';++i)
if(ton[i])
s.insert(node(x,x+ton[i]-1,i)) , x+=ton[i] ;
}
void print(){
ITer x = s.begin() ;
for(;x!=s.end();++x){
cerr<<"pair<"<<x->l<<","<<x->r<<","<<x->v<<"> ;"<<endl ;
}
}
};
int n,m ; string ipt ;
int nl = 0 ;
pair<int,char> pr ;
int main(){
char last ;
read(n) , read(m) ; cin>>ipt ;
for(auto& i:ipt) i = tolower(i) ;
last = ipt[0] ; pr = make_pair(0,ipt[0]) ;
for(int i=0,len=ipt.size();i<=len;++i){
if(ipt[i]==last) ++pr.first ;
else{
odt::s.insert(odt::node(nl,nl+pr.first-1,pr.second)) ;
nl += pr.first ; pr = make_pair(1,ipt[i]) ; last = ipt[i] ;
}
}
odt::print() ;
while(m--){
int opt,x,y; char k ;
read(opt) ;
switch(opt){
case 1: { read(x),read(y),scanf("%c",&k),k=tolower(k),--x,--y,printf("%d\n",odt::query(x,y,k)) ; break ; }
case 2: { read(x),read(y),scanf("%c",&k),k=tolower(k),--x,--y,odt::assign_val(x,y,k) ; break ; }
case 3: { read(x),read(y),--x,--y,odt::st(x,y) ; break ; }
}
}
}
98行切紫题,爽!
题解【语文1(chin1)- 理理思维】的更多相关文章
- 【题解】Luogu P2787 语文1(chin1)- 理理思维
原题传送门:P2787 语文1(chin1)- 理理思维 前置芝士:珂朵莉树 窝博客里对珂朵莉树的介绍 没什么好说的自己看看吧 珂朵莉树跑的飞快,但还是没有memset0小姐姐跑得快 操作1:暴力统计 ...
- [luogu] P2787 语文1(chin1)- 理理思维(分块)
P2787 语文1(chin1)- 理理思维 题目背景 蒟蒻HansBug在语文考场上,挠了无数次的头,可脑子里还是一片空白. 题目描述 考试开始了,可是蒟蒻HansBug脑中还是一片空白.哦不!准确 ...
- P2787 语文1(chin1)- 理理思维
P2787 语文1(chin1)- 理理思维 1.获取第x到第y个字符中字母k出现了多少次 2.将第x到第y个字符全部赋值为字母k 3.将第x到第y个字符按照A-Z的顺序排序 读字符串我再单个单个读我 ...
- 洛谷 P2787 语文1(chin1)- 理理思维
题意简述 维护字符串,支持以下操作: 0 l r k:求l~r中k的出现次数 1 l r k:将l~r中元素赋值为k 2 l r:询问l~r中最大连续1的长度 题解思路 珂朵莉树暴力赋值,查询 代码 ...
- 2019.01.19 洛谷P2787 语文1(chin1)- 理理思维(ODT)
传送门 ODTODTODT水题. 题意:有一个字母序列,支持区间赋值,查询区间某个字母的数量,区间按字母序排序. 思路: 可以开262626棵线段树搞过去,然而也可以用ODTODTODT秒掉. 如果用 ...
- 洛谷P2787 语文1(chin1)- 理理思维(珂朵莉树)
传送门 一看到区间推倒……推平操作就想到珂朵莉树 区间推平直接assign,查询暴力,排序的话开一个桶统计,然后一个字母一个字母加就好了 开桶统计的时候忘了保存原来的左指针然后挂了233 //mina ...
- 洛谷P2787 语文1(chin1)- 理理思维
洛谷题目链接 珂朵莉树吼啊!!! 对于操作$1$,直接普通查询即可 对于操作$2$,直接区间赋值即可 对于操作$3$,其实也并不难,来一次计数排序后,依次插入即可,(注意初始化计数器数组)具体实现看代 ...
- 【bzoj4736/uoj#274】[清华集训2016]温暖会指引我们前行 语文题+LCT
题目描述 http://uoj.ac/problem/274 题解 语文题+LCT 对于这种语文题建议还是自己读题好一些... 读懂题后发现:由于温度互不相同,最大生成树上的路径必须走(不走的话温度大 ...
- codeforces 876 F. High Cry(思维)
题目链接:http://codeforces.com/contest/876/problem/F 题解:一道简单的思维题,知道最多一共有n*(n+1)/2种组合,不用直接找答案直接用总的组合数减去不符 ...
随机推荐
- Python 正则表达式(RegEx)
版权所有,未经许可,禁止转载 章节 Python 介绍 Python 开发环境搭建 Python 语法 Python 变量 Python 数值类型 Python 类型转换 Python 字符串(Str ...
- Docker Ubuntu 例子
版权所有,未经许可,禁止转载 章节 Docker 介绍 Docker 和虚拟机的区别 Docker 安装 Docker Hub Docker 镜像(image) Docker 容器(container ...
- Django 异常处理
我们新建一个py文件 # 在restful中导入exception_handler from rest_framework.views import exception_handler from dj ...
- robotframework+selenium2Library怎样不用手动关掉代理
每次跑脚本,启动浏览器都要手动关掉代理,太费劲了,发现最简单的办法就是在局域网设置里面勾上跳过本地地址的代理服务器,并且在例外里写上127.0.0.1 就这么简单有没有??
- Day 13:File类的常用方法
路径问题: 绝对路径: 该文件在硬盘上 的完整路径.绝对路径一般都是以盘符开头的. 相对路径: 相对路径就是资源文件相对于当前程序所在的路径. . 当前路径 .. 上一级路径 注意: 如果程 ...
- 2019山东ACM省赛L题题解(FLOYD传递闭包的变形)
本题地址 https://cn.vjudge.net/contest/302014#problem/L Median Time Limit: 1 Second Memory Limit: 6 ...
- Mysql:循环结构
循环结构 分类 while loop repeat 循环控制: iterate类似continue ,继续, 结束本次循环,继续下一次 leave 类似于break 跳出 结束当前所 ...
- 【剑指Offer】面试题03. 数组中重复的数字
题目 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意 ...
- Day2-T4
原题目 当然这是原题+,要输路径的.所以必须DFS. Describe:DP or DFS code: #include<bits/stdc++.h> using namespace st ...
- 吴裕雄--天生自然Django框架开发笔记:Django 模板
使用 django.http.HttpResponse() 来输出 "Hello World!".该方式将数据与视图混合在一起,不符合 Django 的 MVC 思想. Djang ...