题解【语文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种组合,不用直接找答案直接用总的组合数减去不符 ...
随机推荐
- java基础源码 (1)--String类
这个是String类上面的注释,我用谷歌翻译翻译的,虽然有点语法上的问题,但是大概都可以翻译出来 /** * The {@code String} class represents character ...
- 【pwnable.kr】fb
这是pwnable.kr的签到题,记录pwn入门到放弃的第一篇. ssh fd@pwnable.kr -p2222 (pw:guest) 题目很简单,登录上了ssh后,发现了3个文件:fd,fd.c, ...
- python虚拟环境配置(上)
前言 嘿,小伙伴们,晚上好呀,我们又见面了,今天又给带来的是什么呢,咱们今天就来说一下python的虚拟环境,可能有的小伙伴会疑惑,python的虚拟环境有什么用呢,我们来一一探讨一下 虚拟环境的作用 ...
- 安装scrapy 爬虫框架
安装scrapy 爬虫框架 个人根据学习需要,在Windows搭建scrapy爬虫框架,搭建过程种遇到个别问题,共享出来作为记录. 1.安装python 2.7 1.1下载 下载地址 1.2配置环境变 ...
- INSTALL_FAILED_SHARED_USER_INCOMPATIBLE错误解决
Target device: smartisan-yq601-3fa1a5dcInstalling APK: /Users/wangliang/workspace/emm-android/build/ ...
- PAT Advanced 1013 Battle Over Cities (25) [图的遍历,统计连通分量的个数,DFS,BFS,并查集]
题目 It is vitally important to have all the cities connected by highways in a war. If a city is occup ...
- Mybatis 持久化,持久层
持久化 持久化是将程序数据在持久状态和瞬时状态间转换的机制. 即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘).持久化的主要应用是将内存中的对象存储在数据库中,或者存储在磁盘文件中.X ...
- Java查漏补缺(3)(面向对象相关)
Java查漏补缺(3) 继承·抽象类·接口·静态·权限 相关 this与super关键字 this的作用: 调用成员变量(可以用来区分局部变量和成员变量) 调用本类其他成员方法 调用构造方法(需要在方 ...
- promise核心6 自定义promise
1.定义整体结构(不写实现) 定义一个自己的promise的库 lib(库的简写) 一个js文件.一个js模块(不能用es6 也不能commjs)(用es5模块语法 ) 匿名函数自调用.IIFE ( ...
- tensorflow--conv函数
#第一种yolo3中程序 def convolutional(input_data, filters_shape, trainable, name, downsample=False, activat ...