题目: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. xcode 没有 iphone4s 模拟器 的解决方法..

    项目需要iphone 4s 测试. 首先是Xcode 8 没有 iphone 4s的模拟器了. 由于线上安装的方式,不管是在code的add simulator 还是 ruby gem 的code-i ...

  2. UIImage类方法总结及UIImage生成方法对比

    http://mp.weixin.qq.com/s/A900w0Y5pGjuaB4j9Os9ww1.UIImage 生成方法的对比 Apple官方的文档为生成一个UIImage对象提供了两种方法: 1 ...

  3. 以深圳.NET俱乐部名义 的技术交流会圆满成功

    2017年5月13日的深圳下着暴雨,一场以深圳.NET俱乐部名义的.NET技术交流会在微软Build 2017刚闭幕时在罗湖布吉路与翠山路交界处富基PARK国际6F举办,这次交流以微软Build 20 ...

  4. [置顶] xamarin Tablayout+Viewpager+Fragment顶部导航栏

    最近几天不忙,所以把项目中的顶部导航栏的实现归集一下.android中使用TabLayout+ViewPager+Fragment制作顶部导航非常常见,代码实现也比较简单.当然我这个导航栏是基于xam ...

  5. php实现socket推送技术

    在socket出现之前已经有ajax定时请求.长轮询等方案,但都不能满足需求,socket就应用而生了. socket基本函数socket 总结下常用的socket函数 服务端: socket_cre ...

  6. 由于DG Broker的配置导致RAC某实例无法mount

    今天碰到一个我自己实验室发生的故障,起初看起来很简单,但实际上还很有趣,而且不细心的话还容易被忽视掉.相信在生产环境也会有客户会实际遇到. 环境:Oracle 11.2.0.4 RAC (2 node ...

  7. springBoot系列教程06:参数验证及验证信息国际化

    在springboot应用中要验证参数是否正确很简单,web应用已经包含了validation的 1.定义需要被验证的参数实体,并用注解标明错误类别和错误信息 package com.xiao.dom ...

  8. C#学习之设计模式:工厂模式

    最近研究一下设计模式中工厂模式的应用,在此记录如下: 什么是工厂模式? 工厂模式属于设计模式中的创造型设计模式的一种.它的主要作用是协助我们创建对象,为创建对象提供最佳的方式.减少代码中的耦合程度,方 ...

  9. vue的挖坑和爬坑之css背景图样式终极解决方法

    原问题 #wrapper{ width:100%; height:100%; position:fixed; background-image:url(./img/open_bg.jpg) } 在.v ...

  10. Vue 爬坑之路(三)—— 使用 vue-router 跳转页面

    使用 Vue.js 做项目的时候,一个页面是由多个组件构成的,所以在跳转页面的时候,并不适合用传统的 href,于是 vue-router 应运而生. 官方文档: https://router.vue ...