记操作序列为$S$,令$h(S)\equiv \sum_{i}a_{i}x^{i}(mod\ p)$(其中$a_{i}$为操作后的结果)

(以下我们将$S$看作字符串,相邻即拼接操作)

对于操作,有$h(1S)=xh(S)$,$h(3S)=h(S)+1$(另外两种操作类似),这可以看作一个函数,即定义函数$g_{S_{1}}(h(S_{2}))=h(S_{1}S_{2})$

令$s[i,j]$表示操作序列的区间$[i,j]$的子串,则有$g_{s[1,i)}h(s[i,j])=h([1,j])$,同时区间$[i,j]$合法当且仅当$h(s[i,j])=h[s(1,n)]$,即等价于$pre_{j}=g_{s[1,i)}(pre_{n})$(其中$pre_{j}=h(s[1,j])$)

发现右边仅与$i$有关,倒序枚举$i$求出该值,然后在$[i,n]$中找到相同的$pre_{j}$数量,可以用map维护,时间复杂度为$o(n\log_{2}n)$

(后面的值计算可能比较麻烦,可以将$s[1,i)$中的位移和权值拆开来计算)

考虑哈希冲突的概率,假设$x$为变量,那么$h(S)$就是一个关于$x$的函数,且其次数至多为$2n$(算上负幂次),因此$h(S_{1})=h(S_{2})$也就是一个$2n$次的同余方程,由于$p$为大素数,解数量基本为$2n$个

假设选择了$k$个$x$,而$2n$个解就会使得$(2n)^{k}$组$x$不合法,共要判断$o(n^{2})$对哈希值,即会使得$o(n^{2}(2n)^{k})$(同样忽略此处相同)组$x$不合法

对于总共$p^{k}$种,不能选$n^{2}(2n)^{k}$种,即不合法概率为$n^{2}(\frac{2n}{p})^{k}$,取$k=6$,$p$~$10^{9}$可以基本避免冲突

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 250005
4 #define mod 1000000007
5 struct ji{
6 int a[6];
7 bool operator < (const ji &k)const{
8 for(int i=0;i<6;i++)
9 if (a[i]!=k.a[i])return a[i]<k.a[i];
10 return 0;
11 }
12 }o,a[N];
13 map<ji,int>mat;
14 int n,p[N],mi[6][N],mi_inv[6][N],x[6]={998244311,998244341,998244353,998244389,998244391,998244397};
15 long long ans;
16 char s[N];
17 int ksm(int n,int m){
18 if (!m)return 1;
19 int s=ksm(n,m>>1);
20 s=1LL*s*s%mod;
21 if (m&1)s=1LL*s*n%mod;
22 return s;
23 }
24 int calc(int p,int k){
25 if (k>=0)return mi[p][k];
26 return mi_inv[p][-k];
27 }
28 int main(){
29 scanf("%d%s",&n,s);
30 for(int i=0;i<5;i++){
31 mi[i][0]=1;
32 for(int j=1;j<=n;j++)mi[i][j]=1LL*mi[i][j-1]*x[i]%mod;
33 mi_inv[i][1]=ksm(x[i],mod-2);
34 for(int j=2;j<=n;j++)mi_inv[i][j]=1LL*mi_inv[i][j-1]*mi_inv[i][1]%mod;
35 }
36 p[0]=0;
37 for(int i=1;i<=n;i++){
38 p[i]=p[i-1];
39 a[i]=a[i-1];
40 if (s[i-1]=='<')p[i]--;
41 if (s[i-1]=='>')p[i]++;
42 if (s[i-1]=='+')
43 for(int j=0;j<6;j++)a[i].a[j]=(a[i].a[j]+calc(j,p[i]))%mod;
44 if (s[i-1]=='-')
45 for(int j=0;j<6;j++)a[i].a[j]=(a[i].a[j]+mod-calc(j,p[i]))%mod;
46 }
47 for(int i=n;i;i--){
48 for(int j=0;j<6;j++)o.a[j]=(1LL*a[n].a[j]*calc(j,p[i-1])+a[i-1].a[j])%mod;
49 mat[a[i]]++;
50 ans+=mat[o];
51 }
52 printf("%lld",ans);
53 }

[atARC099F]Eating Symbols Hard的更多相关文章

  1. Atcoder 乱做

    最近感觉自己思维僵化,啥都不会做了-- ARC103 F Distance Sums 题意 给定第 \(i\) 个点到所有点的距离和 \(D_i\) ,要求构造一棵合法的树.满足第 \(i\) 个点到 ...

  2. 【AtCoder】ARC099题解

    C - Minimization 每次操作必然包含一个1 枚举第一次操作的位置计算两边即可 代码 #include <bits/stdc++.h> #define fi first #de ...

  3. AtCoder Regular Contest 99

    传送门 C - Minimization 第一次可能有多种选择,我们枚举所有的选择,然后两边贪心取即可. Code #include <bits/stdc++.h> #define MP ...

  4. Undefined symbols for architecture arm64解决方案

    在iOS开发中经常遇到的一个错误是Undefined symbols for architecture arm64,这个错误表示工程某些地方不支持arm64指令集.那我们应该怎么解决这个问题了?我们不 ...

  5. Clang: Undefined symbols, but it is there using nm.

    https://stackoverflow.com/questions/36662920/xcode-clang-link-build-dynamic-framework-or-dylib-not-e ...

  6. 转载:《TypeScript 中文入门教程》 16、Symbols

    版权 文章转载自:https://github.com/zhongsp 建议您直接跳转到上面的网址查看最新版本. 介绍 至ECMAScript 2015开始,symbol成为了一种新的原始类型,就像n ...

  7. ios build时,Undefined symbols for architecture xxx问题的总结

    简单来说,Undefined symbols基本上等于JAVA的ClassNotFoundException,最常见的原因有这几种: build的时候没有加framework 比如说,有一段代码我用了 ...

  8. Undefined symbols for architecture x86_64: "_OBJC_CLASS_$_The49DayPersonalFullscreenGiftModel", referenced from: objc-class-ref in The49DayPersonalRoomGiftModel.o ld: symbol(s) not found for a

    Undefined symbols for architecture x86_64: "_OBJC_CLASS_$_The49DayPersonalFullscreenGiftModel&q ...

  9. ios开发错误之: Undefined symbols for architecture x86_64

    错误如下: Undefined symbols for architecture x86_64: "_OBJC_CLASS_$_RoutingHTTPServer", refere ...

随机推荐

  1. Python技法2:函数参数的进阶用法

    1.关键字参数(positional argument)和位置参数(keyword argument) Python函数的参数根据函数在调用时(注意,不是函数定义时)传参的形式分为关键字参数和位置参数 ...

  2. 活动回顾|ShardingSphere X openGauss,将会产生怎样的化学反应?

    "ShardingSphere 作为 openGauss 生态的开源分布式数据库解决方案,将持续助力于 openGauss,满足千行百业广大客户分布式场景需求." 5月29日,由  ...

  3. 洛谷4719 【模板】动态dp 学习笔记(ddp 动态dp)

    qwq大概是混乱的一个题. 首先,还是从一个比较基础的想法开始想起. 如果每次暴力修改的话,那么每次就可以暴力树形dp 令\(dp[x][0/1]\)表示\(x\)的子树中,是否选择\(x\)这个点的 ...

  4. 【UE4 C++】Input 输入事件绑定

    轴映射与动作映射 编辑器设置input+代码实现具体动作 void AMyCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInp ...

  5. 974.和可被K整除的子数组

    题目 给定一个整数数组 A,返回其中元素之和可被 K 整除的(连续.非空)子数组的数目. 示例: 输入:A = [4,5,0,-2,-3,1], K = 5 输出:7 解释: 有 7 个子数组满足其元 ...

  6. 正则表达式: NFA引擎匹配原理

    NFA引擎匹配原理 1       为什么要了解引擎匹配原理 一个个音符杂乱无章的组合在一起,弹奏出的或许就是噪音,同样的音符经过作曲家的手,就可以谱出非常动听的乐曲,一个演奏者同样可以照着乐谱奏出动 ...

  7. Spring Cloud Gateway 网关限流

    Spring Cloud Gateway 限流 一.背景 二.实现功能 三.网关层限流 1.使用默认的redis来限流 1.引入jar包 2.编写配置文件 3.网关正常响应 4.网关限流响应 2.自定 ...

  8. websocket入门案例(echo)

    websocket是用来干什么的,具体的请自行百度. 本文实现一个简单的websocket的入门小例子,实现客户端发送一句换,服务器端返回.即一个简单的交互. 一.服务器端的实现 1.创建一个类实现S ...

  9. 零基础学习STM32之入门学习路线

    可以说就目前的市场需求来看,stm32在单片机领域已经拥有了绝对的地位,51什么的已经过时了也只能拿来打基础了,最后依然会转到stm32来,也正是因为这样stm32的学习者越来越多,其中不难发现绝大部 ...

  10. 字符串与模式匹配算法(五):BMH算法

    一.BMH算法介绍 在BM算法的实际应用中,坏字符偏移函数的应用次数要远远超过好后缀偏移函数的应用次数,坏字符偏移函数在匹配过程中起着移动指针的主导作用.在实际匹配过程,只是用坏字符偏移函数也非常有效 ...