题目:http://codeforces.com/problemset/problem/610/E

如果存在c1,c2在原串相邻且在询问串中c1在c2前面的话,把它们在原串出现次数加起来记作sum,那么n-sum就是答案。

维护一棵线段树,线段树的每个节点存一个k^2的矩阵。

然后修改的话就在线段树上区间修改。。(标记下传的时候要注意不要越界TAT。。。

然后询问的话就k^2搞一下需要被减掉的字符对就好了。。

#include<cstring>
#include<iostream>
#include<algorithm>
#include<cstdio>
#define rep(i,l,r) for (int i=l;i<=r;i++)
#define down(i,l,r) for (int i=l;i>=r;i--)
#define clr(x,y) memset(x,y,sizeof(x))
#define low(x) (x&(-x))
#define maxn 12
#define ll long long
using namespace std;
int n,m,K,ans;
char s[],s2[maxn];
int a[maxn][maxn];
struct data{int mat[maxn][maxn],l,r,tag;
}t[*];
int read(){
int x=,f=; char ch=getchar();
while (!isdigit(ch)) {if (ch=='-') f=-; ch=getchar();}
while (isdigit(ch)){x=x*+ch-''; ch=getchar();}
return x*f;
}
void combine(data &a,data b,data c){
a.l=b.l; a.r=c.r;
rep(i,,K-) rep(j,,K-) a.mat[i][j]=b.mat[i][j]+c.mat[i][j];
a.mat[b.r][c.l]++;
a.tag=-;
}
void build(int i,int l,int r){
int mid=(l+r)/;
if (l==r){
t[i].tag=-; t[i].l=t[i].r=s[l]-'a';
clr(t[i].mat,);
return ;
}
build(i*,l,mid); build(i*+,mid+,r);
combine(t[i],t[i*],t[i*+]);
}
void ps(int i,int l,int r){
if (t[i].tag!=-){
t[i].l=t[i].r=t[i].tag;
clr(t[i].mat,);
t[i].mat[t[i].tag][t[i].tag]=r-l;
if (l!=r) t[i*].tag=t[i*+].tag=t[i].tag;
t[i].tag=-;
}
}
void change(int i,int l,int r,int tl,int tr,int val){
ps(i,l,r);
int mid=(l+r)/;
if (l==tl&&r==tr){
t[i].tag=val;
ps(i,l,r);
return ;
}
if (tr<=mid) {
change(i*,l,mid,tl,tr,val);
ps(i*+,mid+,r);
}
else if (tl>mid){
change(i*+,mid+,r,tl,tr,val);
ps(i*,l,mid);
}
else {
change(i*,l,mid,tl,mid,val);
change(i*+,mid+,r,mid+,tr,val);
}
combine(t[i],t[i*],t[i*+]);
}
int main(){
n=read(); m=read(); K=read();
scanf("%s",s);
build(,,n-);
rep(i,,m){
int op=read();
if (op==){
int l=read()-,r=read()-; scanf("%s",s2);
int now=s2[]-'a';
change(,,n-,l,r,now);
}
else {
ans=n;
scanf("%s",s2);
rep(j,,K-) rep(k,,K-) a[j][k]=;
rep(j,,K-) rep(k,j+,K-) a[s2[j]-'a'][s2[k]-'a']=;
rep(j,,K-) rep(k,,K-) ans-=t[].mat[j][k]*a[j][k];
printf("%d\n",ans);
}
}
return ;
}

CF 610E. Alphabet Permutations的更多相关文章

  1. Codeforces Round #337 Alphabet Permutations

    E. Alphabet Permutations time limit per test:  1 second memory limit per test:  512 megabytes input: ...

  2. CF数据结构练习

    1. CF 438D The Child and Sequence 大意: n元素序列, m个操作: 1,询问区间和. 2,区间对m取模. 3,单点修改 维护最大值, 取模时暴力对所有>m的数取 ...

  3. CF 715 E. Complete the Permutations

    CF 715 E. Complete the Permutations 题目大意:给定两个排列\(p,q\)的一部分.定义两个排列\(p,q\)的距离为使用最少的交换次数使得\(p_i=q_i\).对 ...

  4. CF 1093 E. Intersection of Permutations

    E. Intersection of Permutations 链接 题意: 给定两个序列,询问第一个排列的[l1,r1]和第二个排列[l2,r2]中有多少个共同的数,支持在第二个排列中交换两个数. ...

  5. cf 251 B Playing with Permutations 暴力 分类讨论

    题链;http://codeforces.com/problemset/problem/251/B B. Playing with Permutations time limit per test 2 ...

  6. CF 463D Gargari and Permutations [dp]

    给出一个长为n的数列的k个排列(1 ≤ n ≤ 1000; 2 ≤ k ≤ 5).求这个k个数列的最长公共子序列的长度 dp[i]=max{dp[j]+1,where j<i 且j,i相应的字符 ...

  7. CF 1093E Intersection of Permutations——CDQ分治

    题目:http://codeforces.com/contest/1093/problem/E 只能想到转化成查询一个区间里值在一个范围里的数的个数…… 没有想到这样适合用主席树套树状数组维护.不过据 ...

  8. 【题解】CF#285 E-Positions in Permutations

    挺有收获的一道题ヾ(◍°∇°◍)ノ゙ 恰好为 m ,这个限制仿佛不是很好处理.一般而言,我所了解的恰好为 k 的条件,不是用组合数 / dp状态转移 / 斜率二分就只剩下容斥了.我们可以先处理出 nu ...

  9. CF D. Number Of Permutations 排列

    挺水的一道题~ 拿全排列随便乘一下就好了. #include <cstdio> #include <algorithm> #define N 300004 #define ll ...

随机推荐

  1. iOS 多线程 简单学习NSThread NSOperation GCD

    1:首先简单介绍什么叫线程 可并发执行的,拥有最小系统资源,共享进程资源的基本调度单位. 共用堆,自有栈(官方资料说明iOS主线程栈大小为1M,其它线程为512K). 并发执行进度不可控,对非原子操作 ...

  2. 转:IT巨头纷纷“卡位” 智能语音成人机交互入口必争之地

    http://www.cs.com.cn/xwzx/hwxx/201707/t20170712_5368595.html 随着物联网的迅速发展,作为重要接口的智能语音技术已成为国内外IT巨头的必争之地 ...

  3. Xamarin Android Fragment的两种加载方式

    android Fragment的重点: 3.0版本后引入,即minSdk要大于11 Fragment需要嵌套在Activity中使用,当然也可以嵌套到另外一个Fragment中,但这个被嵌套的Fra ...

  4. 工厂方法模式(Method Factory),理解多态应用的好例子.

    工厂方法模式又称为多态性工厂,个人认为多态性工厂更能准确的表达这个模式的用处.与简单工厂(静态工厂)相比较,这里的多态性是指抽象出一个工厂基类,将因为一个产品有N种不同的是现这种变化封装起来,将具体的 ...

  5. Docker(四):Docker基本网络配置

    1.Libnetwork Libnetwork提出了新的容器网络模型简称为CNM,定义了标准的API用于为容器配置网络. CNM三个重要概念: 沙盒:一个隔离的网络运行环境,保存了容器网络栈的配置,包 ...

  6. 与apk签名有关的那些概念与命令

    一.概念篇 1.消息摘要-Message Digest 消息摘要:在消息数据上,执行一个单向的hash函数,生成一个固定长度的hash值,这个Hash值就是消息摘要,也成为数字指纹. 消息摘要特点: ...

  7. LANMP On CentOS 6

    摘要 --在CentOS6.2-x86_64上安装Apache,Nginx,MySQL,Php 环境:最小化安装系统 yum install lrzsz mlocate.x86_64 wget lso ...

  8. Linux 下Beanstalk安装

    1.安装 # wget https://github.com/kr/beanstalkd/archive/v1.10.tar.gz # tar xzvf v1.10 # cd beanstalkd-1 ...

  9. Head First设计模式之原型模式

    一.定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 原型模式是一种比较简单的模式,也非常容易理解,实现一个接口,重写一个方法即完成了原型模式.在实际应用中,原型模式很少单独出现 ...

  10. 在ssh框架中service,action,jsp,formbeam,dao的调用顺序

    本文来自:http://blog.csdn.net/w_basketboy24/article/details/8642846 jsp发起请求. actionform封装请求参数. action接受请 ...