原题传送门:P2787 语文1(chin1)- 理理思维

前置芝士:珂朵莉树

窝博客里对珂朵莉树的介绍

没什么好说的自己看看吧

珂朵莉树跑的飞快,但还是没有memset0小姐姐跑得快

操作1:暴力统计出奇迹

操作2:推平区间,珂朵莉树基本操作

操作3:排序区间,我就写了一个桶排

窝一开始头文件直接用bits出玄学ce

toupper是把小写转大写,以防数据出锅

#pragma GCC optimize("O3")
#include<cstdio>
#include<cctype>
#include<cstring>
#include<set>
#define IT set<node>::iterator
using namespace std;
inline int read()
{
register int x=0,f=1;register char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
struct node
{
int l,r;
mutable char v;
node(int L, int R=-1, char V=0):l(L), r(R), v(V) {}
bool operator<(const node& o) const
{
return l < o.l;
}
};
set<node> s;
IT split(int pos)
{
IT 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;
}
int count(int l,int r,char v)
{
IT itr = split(r+1) ,itl = split(l);
int ans=0;
for( ; itl != itr ; ++itl)
if(itl->v == v)
ans+=itl->r-itl->l+1;
return ans;
}
void assign_val(int l,int r,char v)
{
IT itr = split(r+1),itl = split(l);
s.erase(itl, itr);
s.insert(node(l, r, v));
}
void sort_val(int l,int r)
{
int cnt[27];
memset(cnt,0,sizeof(cnt));
IT itr = split(r+1), itl = split(l), it = itl;
for( ; itl != itr ; ++itl)
cnt[itl->v-'A']+=itl->r-itl->l+1;
s.erase(it,itr);
for(register int i=0;i<26;++i)
if(cnt[i])
{
s.insert(node(l,l+cnt[i]-1,i+'A'));
l+=cnt[i];
}
}
char str[50005];
int main()
{
int n=read(),m=read();
scanf("%s",str+1);
int cnt=1;
char last=toupper(str[1]);
for(register int i=2;i<=n;++i)
{
str[i]=toupper(str[i]);
if(str[i]==last)
++cnt;
else
{
s.insert(node(i-cnt,i-1,last));
last=str[i];
cnt=1;
}
}
s.insert(node(n+1-cnt,n,last));
while(m--)
{
int opt=read(),l=read(),r=read();
char dic[5];
if(opt==1)
{
scanf("%s",dic);
printf("%d\n",count(l,r,toupper(dic[0])));
}
else if(opt==2)
{
scanf("%s",dic);
assign_val(l,r,toupper(dic[0]));
}
else
sort_val(l,r);
}
return 0;
}

【题解】Luogu P2787 语文1(chin1)- 理理思维的更多相关文章

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

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

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

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

  3. [题解] Luogu P5446 [THUPC2018]绿绿和串串

    [题解] Luogu P5446 [THUPC2018]绿绿和串串 ·题目大意 定义一个翻转操作\(f(S_n)\),表示对于一个字符串\(S_n\), 有\(f(S)= \{S_1,S_2,..., ...

  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. 题解【语文1(chin1)- 理理思维】

    link 喵~珂朵莉树AC 珂朵莉树?见此处~ 这数据结构太暴力了,所以不讲了 Code: #include<iostream> #include<cstdio> #inclu ...

  9. Luogu 1031 - 均分纸牌 - [有意思的思维题]

    题目链接:https://www.luogu.org/problemnew/show/P1031 题目描述有 $N$ 堆纸牌,编号分别为 $1,2,…,N$.每堆上有若干张,但纸牌总数必为 $N$ 的 ...

随机推荐

  1. AFNetworking 源码解析

    3.0 之后,就取消了NSOperation的控制. 因为根据Apple Developer Document的文档 https://developer.apple.com/documentation ...

  2. Centos6.5建立本地YUM源

    很多情况下公司的服务器是不允许连外网的,那么安装软件的时候就很不方便了,这里就需要建立一个本地YUM源了. 文件位置:/etc/yum.repos.d/    后缀一定是.repo结束. 下面我们搭建 ...

  3. mac date

    格式化UTC为可读格式 mbp:~ gavin$ date -r 1546848158 2019年 1月 7日 星期一 16时02分38秒 CST 获取当前 UTC mbp:~ gavin$ date ...

  4. Go linux 实践2

    今天,看看GO的高级语言特性-方法和接口 废话不多说,直接上代码 ************************************************* 1 package main 2 ...

  5. 已解决(转)关于android - apk(解析错误)解析程序包时出现问题

    如果开发的应用用户较多,那么必须保证应用在多个版本不同的设备上能够正确的运行.这就要求对各个版本比较熟悉,知道在什么版本中加入了什么新的功能或特性.但是Android的版本太多了,是个令人头疼的问题. ...

  6. Could not find result map java.lang.Integer] with root cause

    错误的代码 <select id="selectpGoodsInfoIdByGoodsId" parameterType="java.lang.Integer&qu ...

  7. js判断当前页面是否有父页面,页面部分跳转解决办法,子页面跳转父页面不跳转解决 (原)

    //如果当前页面存在父页面,则当前页面的父页面重新加载(即子页面父页面连带跳转) if(top.location!=self.location){         window.parent.loca ...

  8. 一群猴子排成一圈,按1,2,...,n依次编号

    朋友面试遇到的题,网上大部分都是直接往数组后push的解法,不考虑,下面这个方法看起来很简单,但是我理解不了,有大牛懂得给解释一下 朋友面试遇到的题,网上大部分都是直接往数组后push的解法,不考虑, ...

  9. markdown入门杂记

    系统环境:win10 软件:sublime Text 3 安装插件: markdown editing.markdownlivepreview 修改prference-markdownliveprev ...

  10. python爬虫-基础入门-爬取整个网站《2》

    python爬虫-基础入门-爬取整个网站<2> 描述: 开场白已在<python爬虫-基础入门-爬取整个网站<1>>中描述过了,这里不在描述,只附上 python3 ...