link

喵~珂朵莉树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)- 理理思维】的更多相关文章

  1. 【题解】Luogu P2787 语文1(chin1)- 理理思维

    原题传送门:P2787 语文1(chin1)- 理理思维 前置芝士:珂朵莉树 窝博客里对珂朵莉树的介绍 没什么好说的自己看看吧 珂朵莉树跑的飞快,但还是没有memset0小姐姐跑得快 操作1:暴力统计 ...

  2. [luogu] P2787 语文1(chin1)- 理理思维(分块)

    P2787 语文1(chin1)- 理理思维 题目背景 蒟蒻HansBug在语文考场上,挠了无数次的头,可脑子里还是一片空白. 题目描述 考试开始了,可是蒟蒻HansBug脑中还是一片空白.哦不!准确 ...

  3. P2787 语文1(chin1)- 理理思维

    P2787 语文1(chin1)- 理理思维 1.获取第x到第y个字符中字母k出现了多少次 2.将第x到第y个字符全部赋值为字母k 3.将第x到第y个字符按照A-Z的顺序排序 读字符串我再单个单个读我 ...

  4. 洛谷 P2787 语文1(chin1)- 理理思维

    题意简述 维护字符串,支持以下操作: 0 l r k:求l~r中k的出现次数 1 l r k:将l~r中元素赋值为k 2 l r:询问l~r中最大连续1的长度 题解思路 珂朵莉树暴力赋值,查询 代码 ...

  5. 2019.01.19 洛谷P2787 语文1(chin1)- 理理思维(ODT)

    传送门 ODTODTODT水题. 题意:有一个字母序列,支持区间赋值,查询区间某个字母的数量,区间按字母序排序. 思路: 可以开262626棵线段树搞过去,然而也可以用ODTODTODT秒掉. 如果用 ...

  6. 洛谷P2787 语文1(chin1)- 理理思维(珂朵莉树)

    传送门 一看到区间推倒……推平操作就想到珂朵莉树 区间推平直接assign,查询暴力,排序的话开一个桶统计,然后一个字母一个字母加就好了 开桶统计的时候忘了保存原来的左指针然后挂了233 //mina ...

  7. 洛谷P2787 语文1(chin1)- 理理思维

    洛谷题目链接 珂朵莉树吼啊!!! 对于操作$1$,直接普通查询即可 对于操作$2$,直接区间赋值即可 对于操作$3$,其实也并不难,来一次计数排序后,依次插入即可,(注意初始化计数器数组)具体实现看代 ...

  8. 【bzoj4736/uoj#274】[清华集训2016]温暖会指引我们前行 语文题+LCT

    题目描述 http://uoj.ac/problem/274 题解 语文题+LCT 对于这种语文题建议还是自己读题好一些... 读懂题后发现:由于温度互不相同,最大生成树上的路径必须走(不走的话温度大 ...

  9. codeforces 876 F. High Cry(思维)

    题目链接:http://codeforces.com/contest/876/problem/F 题解:一道简单的思维题,知道最多一共有n*(n+1)/2种组合,不用直接找答案直接用总的组合数减去不符 ...

随机推荐

  1. P 1015 德才论

    转跳点:

  2. JMP CALL RET

    一.JMP指令(修改EIP的值)(第一个修改EIP的指令) 三种方法 :JMP 立即数 JMP  寄存器 JMP  内存 EIP 之前介绍过,EIP存放的值就是cpu下一次要执行的地址 1.之前学过要 ...

  3. rdlc报表带参数打印

    1.新建rdlc文件报表 2.选中rdlc文件=>视图=>报表资料 添加几个参数,如图 设计报表页面 int WaitNum = this.queueDTOs.Where(m=>m. ...

  4. 很多内容是转载或copy各个大佬的

    很多内容是转载或copy各个大佬的

  5. Spring注解@ResponseBody

    @Responsebody 将内容或对象作为http响应正文返回,并调用适合HttpMessageConverter的Adapter转换对象,写入输出流. 写在方法上面表示:表示该方法的返回结果直接写 ...

  6. 解决 .NET CORE3.0 MVC视图层不即时编译

    微软官方文档 Razor 编译 Razor SDK 默认启用 Razor 文件的生成时和发布时编译. 启用后,运行时编译将补充生成时编译,允许更新 Razor 文件(如果对其进行编辑). 运行时编译 ...

  7. 使用那各VUE的打印功能(print.js)出现多打印一个空白页的问题

    最近这段时间,用VUE写东西,有个打印功能. 百度了一下,铺天盖地的VUE打印的两种实现方法. 很感激这些千篇一律的帖子,虽然不知道他们是否真的用过,还是只是复制粘贴. 至少这些帖子告诉我,是有两个可 ...

  8. Anaconda: "WinError 127 找不到指定程序"

    Ref: https://blog.csdn.net/mengmengz07/article/details/103629693 问题: Windows系统,使用Anaconda,conda crea ...

  9. 学生选课系统(Java语言期末前测试)

      测试具体要求: 2.系统要求与功能设计 2.1 页面要求 (1)能够在Tomcat服务器中正确部署,并通过浏览器查看: (2)网站页面整体风格统一: (3)首页(登录页)要求实现不同用户登录后,进 ...

  10. 文献阅读报告 - Situation-Aware Pedestrian Trajectory Prediction with Spatio-Temporal Attention Model

    目录 概览 描述:模型基于LSTM神经网络提出新型的Spatio-Temporal Graph(时空图),旨在实现在拥挤的环境下,通过将行人-行人,行人-静态物品两类交互纳入考虑,对行人的轨迹做出预测 ...