• 语文1(chin1)- 理理思维


    洛咕

    题意:考试开始了,可是蒟蒻HansBug脑中还是一片空白。哦不!准确的说是乱七八糟的。现在首要任务就是帮蒟蒻HansBug理理思维。假设HansBug的思维是一长串字符串(字符串中包含且仅包含26个字母),现在的你,有一张神奇的药方,上面依次包含了三种操作:

    1. 获取第x到第y个字符中字母k出现了多少次

    2. 将第x到第y个字符全部赋值为字母k

    3. 将第x到第y个字符按照A-Z的顺序排序

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    #include<queue>
    #include<map>
    #include<set>
    #define ll long long
    #define IT set<node>::iterator
    using namespace std;
    inline int read(){
        int x=0,o=1;char ch=getchar();
        while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
        if(ch=='-')o=-1,ch=getchar();
        while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
        return x*o;
    }
    int sum[30];
    struct node{
    	int l,r;mutable int val;
    	node(int L,int R=-1,int V=0){l=L,r=R,val=V;}
    	bool operator <(const node &x)const{
    		return l<x.l;
    	}
    };
    set<node>s;
    inline 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,val=it->val;
    	s.erase(it);
    	s.insert(node(l,pos-1,val));
    	return s.insert(node(pos,r,val)).first;
    }
    inline void assign(int l,int r,int val){
    	IT itr=split(r+1),itl=split(l);
    	s.erase(itl,itr);
    	s.insert(node(l,r,val));
    }
    void get_sort(int l,int r){
        memset(sum,0,sizeof(sum));
        IT itr=split(r+1),itl=split(l),it=itl;
        for(;it!=itr;++it)sum[it->val]+=it->r-it->l+1;
        s.erase(itl,itr);
        for(int i=1;i<=26;++i)
    		if(sum[i]){
    			s.insert(node(l,l+sum[i]-1,i));
    			l+=sum[i];
    		}
    }
    inline int ask(int l,int r,int val){
    	int ans=0;
    	IT itr=split(r+1),itl=split(l);
    	for(;itl!=itr;++itl)
    		if(itl->val==val)ans+=(itl->r-itl->l+1);
    	return ans;
    }
    int main(){
    	int n=read(),m=read();
    	for(int i=1;i<=n;++i){
    		char ch;cin>>ch;
    		if(ch>='a'&&ch<='z')s.insert(node(i,i,ch-'a'+1));
    		else s.insert(node(i,i,ch-'A'+1));
    	}
    	while(m--){
    		int opt=read(),l=read(),r=read(),val;
    		if(opt==3)get_sort(l,r);
    		else{
    			char ch;cin>>ch;
    			if(ch>='a'&&ch<='z')val=ch-'a'+1;
    			else val=ch-'A'+1;
    			if(opt==1)printf("%d
    ",ask(l,r,val));
    			else assign(l,r,val);
    		}
    	}
        return 0;
    }
    
    
  • 相关阅读:
    金蝶k3 显示BOS序时簿并返回选中的值
    金蝶K3bos插件操作另一张单据
    H2.64的远程回放--开篇
    监控外网访问的几种方式
    ilbc编解码
    windows系统上安装与使用Android NDK r5 (转)
    安卓与PC网络对接实现视频实时播放
    WDR7500 花生壳问题
    要确保任何一次员工的晋升都符合公司的利益
    关于“部门建设”
  • 原文地址:https://www.cnblogs.com/PPXppx/p/11336426.html
Copyright © 2020-2023  润新知