【noip模拟】连环
【题目描述】
惠子说:“连环可解也”。
这说明他是一个破解机关的高手,连连环都能解开,鲁班锁什么的自然不在话下。一位
鲁班的后人非常不服气,于是找到惠子,给他出了一道题。
他首先给了惠子一个长度为 n的字符串s和一个长度为 m 的字符串 t,现在,他有 k 个
询问,每个询问是给出两个整数 L,R,询问任选一对(i,j)满足 1≤i≤L,n≥j≥R,删去 s 的
[i+1,j−1]这个区间的子串,剩下两块拼在一起,求t 在其中的匹配数的期望 e。
惠子非常擅长吹逼,但是对数学却搞不太明白,于是他请你来帮他。
为了防止实数的精度误差,你只需要输出 e×L×(n−R+1)
【输入格式】
第一行一个整数 C,表示数据组数
每组数据,第一行是三个整数n,m,k
接下来一行字符串表示 s
接下来一行字符串表示 t
接下里 k 行,每行两个整数 Li,Ri,表示一组询问
C≤5
n≤5×10^4,m≤100,k≤5×10^4
1≤Li<Ri-1≤n
对于30%的数据,n≤100,k≤100
【输出格式】
对于每组询问,输出一行一个整数表示答案
【样例输入】
1
8 5 4
iamnotsb
iamsb
4 7
3 7
3 8
2 7
【样例输出】
1
1
0
0
【题目分析】
删去一段之后的匹配分两种,一种是本来就匹配的,删除没有影响他,另一种是本来不匹配,删除之后因为两端连接产生的新匹配。
首先考虑第一种:设t的某个匹配为(l,r),推一下公式发现若r≤L,那么这个匹配的贡献为(L−r+1)×(n−R+1)=(L+1)(n−R+1)−r(n−R+1),那么我们可以预处理一下匹配的r的前缀和匹配数的前缀和,就可以O(1)询问出来了。而若l≥R,那么贡献是(l−R+1)×L,也类似的弄两个前缀和出来就好。
现在考虑因为删除中间一坨而产生的新匹配,我们考虑把t拆开成两个非空部分t1,t2,显然这一种的总贡献等同于t1在[1,L]内的匹配数乘以t2在[R,n]内的匹配数,这个也可以预处理一下前缀和,询问的时候枚举拆开的位置就行了。
【code】
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std; const int N = 5e4 + ;
typedef long long ll;
int C, n, m, k, nxt[], revNxt[], lens, lent;
ll pre[N], preCnt[N], last[N], lastCnt[N];
ll tpre[][N], tlast[][N];
char s[N], t[], revt[], revs[N]; inline int read(){
int i = , f = ; char ch = getchar();
for(; (ch < '' || ch > '') && ch != '-'; ch = getchar());
if(ch == '-') f = -, ch = getchar();
for(; ch >= '' && ch <= ''; ch = getchar())
i = (i << ) + (i << ) + (ch - '');
return i * f;
} inline void wr(ll x){
if(x < ) putchar('-'), x = -x;
if(x > ) wr(x / );
putchar(x % + '');
} inline void get_t_nxt(){
for(int i = , j = ; i <= lent; i++){
while(j && t[j + ] != t[i]) j = nxt[j];
if(t[j + ] == t[i]) j++;
nxt[i] = j;
}
} inline void get_r_pre(){
for(int i = , j = ; i <= lens; i++){
pre[i] = pre[i - ];
preCnt[i] = preCnt[i - ];
while(j && s[i] != t[j + ]) j = nxt[j];
if(s[i] == t[j + ]) j++;
if(j == lent){
pre[i] += i;
preCnt[i]++;
j = nxt[j];
}
}
} inline void get_t_rev_nxt(){
for(int i = , j = ; i <= lent; i++){
while(j && revt[j + ] != revt[i]) j = revNxt[j];
if(revt[j + ] == revt[i]) j++;
revNxt[i] = j;
}
} inline void get_l_last(){
for(int i = , j = ; i <= lens; i++){
last[i] = last[i - ];
lastCnt[i] = lastCnt[i - ];
while(j && revs[i] != revt[j + ]) j = revNxt[j];
if(revs[i] == revt[j + ]) j++;
if(j == lent){
last[i] += n - i + ;
lastCnt[i]++;
j = revNxt[j];
}
}
} inline void get_t_pre(){
for(int i = ; i <= lent; i++){
char now[];
int now_nxt[] = {};
for(int j = ; j <= i; j++)
now[j] = t[j];
for(int k = , l = ; k <= i; k++){
while(l && now[l + ] != now[k]) l = now_nxt[l];
if(now[l + ] == now[k]) l++;
now_nxt[k] = l;
}
for(int k = , l = ; k <= lens; k++){
tpre[i][k] = tpre[i][k - ];
while(l && now[l + ] != s[k]) l = now_nxt[l];
if(now[l + ] == s[k]) l++;
if(l == i){
tpre[i][k]++;
l = now_nxt[l];
}
}
}
} inline void get_t_last(){
for(int i = ; i <= lent; i++){
char now[];
int now_nxt[] = {};
for(int j = ; j <= i; j++)
now[j] = revt[j];
for(int k = , l = ; k <= i; k++){
while(l && now[l + ] != now[k]) l = now_nxt[l];
if(now[l + ] == now[k]) l++;
now_nxt[k] = l;
}
for(int k = , l = ; k <= lens; k++){
tlast[i][k] = tlast[i][k - ];
while(l && now[l + ] != revs[k]) l = now_nxt[l];
if(now[l + ] == revs[k]) l++;
if(l == i){
tlast[i][k]++;
l = now_nxt[l];
}
}
}
} int main(){
freopen("lianhuan.in","r",stdin);
freopen("lianhuan.out","w",stdout);
C = read();
while(C--){
n = read(), m = read(), k = read();
scanf("%s", s + );
scanf("%s", t + );
memcpy(revt, t, sizeof t);
memcpy(revs, s, sizeof s);
reverse(revt + , revt + m + );
reverse(revs + , revs + n + );
lent = m;
lens = n;
memset(nxt, , sizeof nxt);
memset(revNxt, , sizeof revNxt);
memset(pre, , sizeof pre);
memset(last, , sizeof last);
memset(tpre, , sizeof tpre);
memset(tlast, , sizeof tlast);
memset(preCnt, , sizeof preCnt);
memset(lastCnt, , sizeof lastCnt);
get_t_nxt();
get_t_rev_nxt();
get_r_pre();
get_l_last();
get_t_pre();
get_t_last();
while(k--){
int L = read(), R = read();
ll ans = ;
ans += preCnt[L] * (L + ) * (n - R + );
ans -= (n - R + ) * pre[L];
ans -= lastCnt[n - R + ] * (R - ) * L;
ans += last[n - R + ] * L;
for(int i = ; i <= lent; i++)
ans += tpre[i][L] * tlast[lent - (i + ) + ][n - R + ];
wr(ans), putchar('\n');
}
}
}
【noip模拟】连环的更多相关文章
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
- 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程
数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...
- 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...
- 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...
- 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...
- CH Round #58 - OrzCC杯noip模拟赛day2
A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...
- CH Round #52 - Thinking Bear #1 (NOIP模拟赛)
A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...
- CH Round #49 - Streaming #4 (NOIP模拟赛Day2)
A.二叉树的的根 题目:http://www.contesthunter.org/contest/CH%20Round%20%2349%20-%20Streaming%20%234%20(NOIP 模 ...
随机推荐
- MySQL主从复制之Mycat简单配置和高可用
什么是Mycat 1.Mycat就是MySQL Server,而Mycat后面连接的MySQL Server,就好象是MySQL的存储引擎,如InnoDB,MyISAM等.因此,Mycat本身并不存储 ...
- 【COGS1672】【SPOJ375】QTREE
这是我的第一个边权链剖 COGS上和SPOJ有点不一样就是没有多组数据了本质还是一样的 我写的是COGS那个事实上改一改就能够去SPOJ AC了= -= (但是我如今上不去SPOJ卧槽(╯‵□′)╯︵ ...
- git stash备份当前工作区内容,回到最近一次commit提交
git stash: 备份当前的工作区的内容,从最近的一次提交中读取相关内容,让工作区保证和上次提交的内容一致.同时,将当前的工作区内容保存到Git栈中.git stash pop: 从Git栈中读取 ...
- 用多年前据说买买提上理论水平最高的帖子做镇楼贴---NASA有吹牛了
美国国会一直有意把nasa 划入国防部,取消太空探索所关联的部门,因为这些部门都是些烧钱的大包袱,而把具有军事意义的部门留下.国会想把烧钱部卖给google,可能是要价太高,最后没有谈拢,不了了之.但 ...
- JS学习笔记 - 普通选项卡(面向过程)
疑问: 1. getElementsByTagName 和 getElementsByClassName 的区别? 分别在什么应用场景? <!DOCTYPE html> <h ...
- HttpWatch--time chart分析
这是一个IE的插件,下载可以点这里.下载后解压如下图所示,一共有4个文件.HttpWatch Professional是单独软件,可以单独使用. 解压后有四个文件 插件安装时,只需运行httpwatc ...
- java——数组
数组是多个同样数据类型数组组合,当中数据类型是不论什么数据类型. 数组变量是引用类型变量,数组能够作为对象,数组中的每个元素相当于对象的成员变量,所以数组元素能够默认初始化.(博客java--变量分类 ...
- Linux下开启关闭防火墙
一.Linux下开启/关闭防火墙命令 1) 永久性生效,重启后不会复原 开启: chkconfig iptables on 关闭: chkconfig iptables off 2) 即时生效,重 ...
- shrio 权限管理filterChainDefinitions过滤器配置(转)
/** * Shiro-1.2.2内置的FilterChain * @see ============================================================= ...
- vmware之linux不重启添加虚拟硬盘
转自http://www.shangxueba.com/jingyan/1610981.html #echo "- - -" > /sys/class/scsi_host/h ...