题解【语文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种组合,不用直接找答案直接用总的组合数减去不符 ...
随机推荐
- CVE-2010-0249(极光)分析报告
2019/9/10 报告doc在文件里面 1. 发现可疑流量 A.分析流量,导出字节流 B.得到网页代码,发现需要执行的代码需要解密(加密的字符串部分太长了,就省略了): C. ...
- PHP操作MYSQL数据库(10.11 第十九天)
一.连接及断开数据库 1.使用mysqli 扩展(推荐),只针对mysql数据库 面向对象的方式 $con = new mysqli(ip,user,password); if($con->co ...
- 记-OSPF学习
LSA Type 1:Router LSA1.传播范围 :只能在本区域2.通告者 :每台路由器 (router-id作为标识)3.内容 :路由和拓扑信息show ip ospf database ro ...
- 使用Oracle VM VirtualBox安装CentOS 7.6操作系统
使用Oracle VM VirtualBox安装CentOS 7.6操作系统 ...
- 21 ~ express ~ 内容详情展示 和 阅读数处理
1,前台 ,/views/main/index.html ,将文章 id 通过url 传送给后台 {% for content in contents %} <div class="p ...
- svn报错:“Previous operation has not finished; run 'cleanup' if it was interrupted“
今天在eclipse上使用SVN:team - 显示资源历史记录 的时候报错. 方法是在本地磁盘项目目录上右键TortoiseSVN - Clean up 我的弹出的界面和下面一样,请勾选Break ...
- COGS1487 麻球繁衍
不会做%%http://blog.csdn.net/doom_bringer/article/details/50428503 #include<bits/stdc++.h> #defin ...
- 1834 [ZJOI2010]network 网络扩容
题解:先在原网络上跑最大流,然后加上带费用的边跑费用流 高一的时候做这道题怎么想不到? 注意:maxn代表的不一定是同一个变量的范围 #include<iostream> #include ...
- 干货分享|Law Essay写作高分攻略
很多法学院的留学生对于Law Essay写作不是特别擅长,理论知识都了解,但是写出来的essay分数就是不高.同学们要从哪些方面入手呢?Law Essay写作要怎么拿高分?具体就跟小编一起来看看吧! ...
- Android自定义View——贝塞尔曲线实现水波纹效果
我们使用到的是Path类的quadTo(x1, y1, x2, y2)方法,属于二阶贝塞尔曲线,使用一张图来展示二阶贝塞尔曲线,这里的(x1,y1)是控制点,(x2,y2)是终止点,起始点默认是Pat ...