题面



题解

我有特殊的哈希技巧

以到下一个相同字符的距离为值哈希, 如果不存在或在串外, 就是 \(|T| + 1\).

加入一个新字符 \(S_i\) 时, 同时修改它上一次出现时的值, 由 \(|T| + 1\) 修改为 \(i\).

详见代码.

代码

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<set>
#include<map>
using namespace std;
#define rep(i,l,r) for(register int i=(l);i<=(r);++i)
#define repdo(i,l,r) for(register int i=(l);i>=(r);--i)
#define il inline
typedef double db;
typedef long long ll;
typedef unsigned long long ull; //---------------------------------------
const int nsz=1e6+50,msz=1e5+50,base=1e5+3;
int n,m;
char s[nsz],t[msz];
il int tr(char c){return c-'a'+1;}
int nes[nsz],prs[nsz];
int net[msz],prt[msz];
ull hs=0,ht=0,pb[msz]{1}; void gene(char *s,int *ne,int *pr,int n){
static int bot[30];
rep(i,1,26)bot[i]=n+1;
repdo(i,n,1){
ne[i]=bot[tr(s[i-1])];
bot[tr(s[i-1])]=i;
}
rep(i,1,26)bot[i]=0;
rep(i,1,n){
pr[i]=bot[tr(s[i-1])];
bot[tr(s[i-1])]=i;
}
} void sol(){
gene(s,nes,prs,n);
gene(t,net,prt,m);
rep(i,1,m){
ht=ht*base+(net[i]==m+1?m+1:net[i]-i);
hs=hs*base+(nes[i]>m?m+1:nes[i]-i);
pb[i]=pb[i-1]*base;
}
if(hs==ht)cout<<1<<'\n';
ull tmp;
rep(i,m+1,n){//[i-m+1,i]
tmp=(nes[i-m]>i-1?m+1:nes[i-m]-(i-m));
hs=hs*base-tmp*pb[m];
tmp=i-prs[i];
if(tmp<m){
hs-=(m+1-tmp)*pb[tmp]; //dynamically modify
}
hs+=m+1;
if(hs==ht)cout<<i-m+1<<'\n';
}
} int main(){
// freopen("c.in","r",stdin);
// freopen("c.out","w",stdout);
ios::sync_with_stdio(0),cin.tie(0);
cin>>s>>t;
n=strlen(s),m=strlen(t);
if(n<m)return 0;
sol();
return 0;
}

11/5/2018模拟 Problem C的更多相关文章

  1. 11/1/2018模拟 Max

    题面 也就是说, 随机序列RMQ.(\(n \le 8388608\), \(m \le 8*10^6\)) 解法 我写了笛卡尔树+tarjan 然而听神仙说, 因为数据随机, 建完树暴力找lca就行 ...

  2. 11.7 NOIP模拟赛

    目录 2018.11.7 NOIP模拟 A 序列sequence(two pointers) B 锁lock(思路) C 正方形square(埃氏筛) 考试代码 B C 2018.11.7 NOIP模 ...

  3. 11/1 NOIP 模拟赛

    11.1 NOIP 模拟赛 期望得分:50:实际得分:50: 思路:暴力枚举 + 快速幂 #include <algorithm> #include <cstring> #in ...

  4. 2018.11.08 NOIP模拟 班车(倍增+dfs+bit)

    传送门 对于每个点离线处理出向上走2i2^i2i班车到的最上面的点. 然后每个询问(u,v)(u,v)(u,v)先把(u,v)(u,v)(u,v)倍增到刚好走不到lcalcalca的情况(有一个点如果 ...

  5. 2018.11.08 NOIP模拟 水管(简单构造)

    传送门 仔细读题会发现只要所有点点权之和等于0一定有解. 如何构造? 直接当做树来构造就行了,非树边都赋值成0就行. 代码

  6. 2018.11.08 NOIP模拟 景点(倍增+矩阵快速幂优化dp)

    传送门 首先按照题意构造出转移矩阵. 然后可以矩阵快速幂求出答案. 但是直接做是O(n3qlogm)O(n^3qlogm)O(n3qlogm)的会TTT掉. 观察要求的东西发现我们只关系一行的答案. ...

  7. 2018.11.07 NOIP模拟 异或(数位dp)

    传送门 对于每个二进制位单独考虑贡献. 然后对于两种情况分别统计. 对于第二种要用类似数位dpdpdp的方法来计算贡献. 代码

  8. 2018.11.07 NOIP模拟 分糖果(贪心)

    传送门 考虑 n = 2 时的情况:假定两个人分别为(a, b),(c, d),则当且仅当min(a,d) ≤ min(b,c)时,把(a, b)放在前面更优,否则把(c, d)放在前面更优 然后把n ...

  9. 2018.11.07 NOIP模拟 数独(模拟)

    传送门 sbsbsb签到题. 读题时间比写题时间长系列. 写一个checkcheckcheck函数来检验当前时间段第(i,j)(i,j)(i,j)号格子能否放入kkk就行了. 代码

随机推荐

  1. java基础 容器 API

  2. 圆角矩形shader

    在游戏中,有时需要对一张矩形图片进行切割,绘制成圆角矩形. circelrect.vert attribute vec4 a_position; attribute vec4 a_normal; at ...

  3. [Luogu4916]魔力环[Burnside引理、组合计数、容斥]

    题意 题目链接 分析 sπo yyb 代码 #include<bits/stdc++.h> using namespace std; typedef long long LL; #defi ...

  4. FineUIMvc随笔(7)扩展通知对话框(显示多个不重叠)

    声明:FineUIMvc(基础版)是免费软件,本系列文章适用于基础版. 这篇文章我们将改造 FineUIMvc 默认的通知对话框,使得同时显示多个也不会重叠.并提前出一个公共的JS文件,供大家使用. ...

  5. C# 实现实时网速

    前言 最近参加了一个项目,所以写博客的时间就少了,项目中有一个功能就是在窗体上显示实时网速,用了半天的时间写了出来,想想今天时间蛮充足,就把它分享到博客上吧. 项目展示 项目核心代码: private ...

  6. MVC5+EF6入门教程——实现动态创建数据库与登录验证

    详细步骤 创建文件夹,规划好项目目录 创建相关实体类 (Data Model) 创建 Database Context 创建Initializer, 使用EF初始化数据库,插入测试数据 实现数据库登录 ...

  7. jqGrid之treeGrid及行拖拽

    单纯的做个小记录 今天做功能用到了jqGrid里面的treeGrid,遇到几个问题,这里做下记录 treeGrid 树表格的应用在官网给出了很直白的例子: 1.http://blog.mn886.ne ...

  8. Python入门-Hello Word

    1.python语言介绍 Python创始人:Guido Van Rossum 2.python是一种解释型.动态类型计算机程序设计语言. 解释型:程序无需编译成二进制代码,而是在执行时对语句一条一条 ...

  9. gnuplot画折线图

    之前尝试用jfreechart画自定义横坐标的折线图或时序图,发现很复杂,后来改用gnuplot了. gnuplot在网上一搜就能找到下载地址. 安装完成后,主要是命令行形式的交互界面,至少比jfre ...

  10. scrapy之环境安装

    scrapy之环境安装 在之前我安装了scrapy,但是在pycharm中却无法使用. 具体情况是: 我的电脑上存在多个python,有python2,python3,anaconda,其中anaco ...