Codeword CodeForces - 666C (字符串计数)
大意:求只含小写字母, 长度为n, 且可以与给定模板串匹配的字符串个数 (多组数据)
记模板串为P, 长为x, 总串为S.
设$f_i$为S为i时的匹配数, 考虑P最后一位的首次匹配位置.
若为S的最后一位,枚举P的前x-1位的首次匹配位置,其余位不能为下一个要匹配的字符,
有方案数$25^{i-x}\binom{i-1}{x-1}$; 否则的话, 最后一位可以放任意字符, 方案数$26f_{i-1}$.
即$f_i=25^{i-x}\binom{i-1}{x-1}+26f_{i-1}$.
这里可以发现结果只与模板串长度有关, 而长度种类数是$O(\sqrt{n})$的, 所以离线后双指针可以实现$O(n\sqrt{n})$.
#include <iostream>
#include <algorithm>
#include <math.h>
#include <cstdio>
#include <set>
#include <vector>
#define REP(i,a,n) for(int i=a;i<=n;++i)
#define pb push_back
#define x first
#define y second
#define endl '\n'
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int P = 1e9+7;
ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}
ll qpow(ll a,ll n) {ll r=1%P;for (a%=P;n;a=a*a%P,n>>=1)if(n&1)r=r*a%P;return r;}
void exgcd(ll a,ll b,ll &d,ll &x,ll &y){b?exgcd(b,a%b,d,y,x),y-=a/b*x:x=1,y=0,d=a;}
ll inv(ll x){return x<=1?1:inv(P%x)*(P-P/x)%P;}
//head const int N = 4e5+10, INF = 0x3f3f3f3f;
int ans[N], n, tot;
vector<pii> g[N];
char s[N];
ll p25[N], in[N]; int main() {
scanf("%d%s", &n, s);
int now = strlen(s);
REP(i,1,n) {
int op, x;
scanf("%d", &op);
if (op==1) {
scanf("%s", s);
now = strlen(s);
} else {
scanf("%d", &x);
g[now].pb({x,++tot});
}
}
p25[0] = 1;
REP(i,1,N-1) {
p25[i] = p25[i-1]*25%P;
in[i] = inv(i);
}
REP(x,1,N-1) if (g[x].size()) {
sort(g[x].begin(),g[x].end());
int mx = g[x].back().x, now = 0;
ll C = 1, dp = 0;
REP(i,x,mx) {
while (g[x][now].x<i) ++now;
dp = (dp*26+C*p25[i-x])%P;
C = C*i%P*in[i+1-x]%P;
while (g[x][now].x==i) ans[g[x][now++].y]=dp;
}
}
REP(i,1,tot) printf("%d\n", ans[i]);
}
Codeword CodeForces - 666C (字符串计数)的更多相关文章
- codeforces 666C Codeword
codeforces 666C Codeword 题意 q个询问,一种询问是给你一个字符串,还有一种是问长度为n的,包含当前字符串为子序列的字符串有多少个. 题解 容易写出式子,但是不好化简. 观察一 ...
- 【BZOJ-4180】字符串计数 后缀自动机 + 矩阵乘法
4180: 字符串计数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 146 Solved: 66[Submit][Status][Discuss] ...
- 【BZOJ 4180】 4180: 字符串计数 (SAM+二分+矩阵乘法)
4180: 字符串计数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 164 Solved: 75 Description SD有一名神犇叫做Oxe ...
- Codeforces Beta Round #17 C. Balance (字符串计数 dp)
C. Balance time limit per test 3 seconds memory limit per test 128 megabytes input standard input ou ...
- CodeForces 625B 字符串模拟+思维
题意 给出字符串a与b 可以将a中的单个字符改为# 问最少改多少次 a中就找不到b了 一开始想的是用strstr 因为如果找到 可以将strstr(a,b)-a+1改成# 即改首字母 用while循环 ...
- bzoj 4180: 字符串计数
Description SD有一名神犇叫做Oxer,他觉得字符串的题目都太水了,于是便出了一道题来虐蒟蒻yts1999. 他给出了一个字符串T,字符串T中有且仅有4种字符 'A', 'B', 'C', ...
- CodeForces - 1025C 字符串处理,画一个圆。。。
题目链接: https://vjudge.net/problem/1810469/origin 题目大意: 给你一个字符串,中间切一刀,左右两边均反转,然后右边的串拼接到左边上. 思路: 比如 aa ...
- Swapping Characters CodeForces - 903E (字符串模拟)
大意: 给定k个字符串, 长度均为n, 求是否存在一个串S, 使得k个字符串都可以由S恰好交换两个字符得到. 暴力枚举交换的两个字符的位置, 计算出交换后与其他串不同字符的个数, 若为1或>2显 ...
- Maximum Questions CodeForces - 900E (字符串,dp)
大意:给定长$n$的字符串$s$, 只含'a','b','?', '?'可以替换为任意字符, 在给定长$t$的字符串, "ababab...", 求替换尽量少的'?', 使得$s$ ...
随机推荐
- vim的简单配置
本文大部分内容转载自:https://blog.csdn.net/lhy2932226314/article/details/69668891 vim是从 vi 发展出来的一个文本编辑器.功能丰富,在 ...
- SpringBoot集成Socket服务后打包(war包)启动时如何启动Socket服务(web应用外部tomcat启动)
1.首先知道SpringBoot打包为jar和war包是不一样的(只讨论SpringBoot环境下web应用打包) 1.1.jar和war包的打开方式不一样,虽然都依赖java环境,但是j ...
- P4824 [USACO15FEB]Censoring (Silver) 审查(银)&&P3121 [USACO15FEB]审查(黄金)Censoring (Gold)
P3121 [USACO15FEB]审查(黄金)Censoring (Gold) (银的正解是KMP) AC自动机+栈 多字符串匹配--->AC自动机 删除单词的特性--->栈 所以我们先 ...
- 20145304 Exp3 免杀原理与实践
20145304 Exp3 免杀原理与实践 基础问题回答 (1)杀软是如何检测出恶意代码的? 检验特征码,包含特征码的代码会被杀软认为是恶意代码,例如一些常用恶意代码加壳后就有一个固定的代码会被认为是 ...
- Socket:读写处理及连接断开的检测
作为进程间通信及网络通信的一种重要技术,在实际的开发中,socket编程是经常被用到的.关于socket编程的一般步骤,这里不再赘述,相关资料和文章很多,google/baidu即可. 本文主要是探讨 ...
- 在服务中用管理员权限创建一个可弹出UI的进程 (转载)
转载:http://blog.csdn.net/woshinia/article/details/7850295 转载:http://blog.csdn.net/hurryboylqs/article ...
- ExtJS使用入门
extjs是基于 yui 由 jack slocum开发, sencha是他们的公司, sencha是由三个项目合并起来的开源项目: ExtJS, jqTouch, Raphael(拉斐尔, 圣经中的 ...
- bzoj1055 ||P4290 [HAOI2008]玩具取名
目录 链接 思路 代码 链接 luogu bzoj 思路 区间dp 然后\(f[i][j][k]\) 区间\([i,j]\)能否变成\(k\)字符 (字符当然得转化一下) 字符的个数不多,直接暴力\( ...
- Mysql相关问题收集
1.查询每个班级的前三名 DROP TABLE IF EXISTS `sc`; CREATE TABLE `sc` ( `id` ) NOT NULL AUTO_INCREMENT, `name` v ...
- JavaScript 时间格式
方法1: Date.prototype.Format = function (fmt) { var o = { , //月份 "d+": this.getDate(), //日 = ...