首页 > 其他分享 >10.6 noi(p) 模拟赛

10.6 noi(p) 模拟赛

时间:2022-10-06 15:35:37浏览次数:51  
标签:nxt AC noi 10.6 int T1 kmp 模拟

\(\rm NOIP\) 模拟赛

\(\rm Date: 10.6\)

去掉 T1 可以当省选练习题了(当然 T4 放 T1)

\(T1\)

哈希即可,也有贪心的做法,但是自然溢出被卡了

\(T2\)

如果是一条链,那么这个操作就是交换前缀和,但是这个结论不能套用到环上。可以把环想象为一个无限长的序列,但是不会维护

摆了

\(T3\)

大概是广义 SAM 建 fail 树跑树剖。

\(T4\)

显然先求一个 kmp,然后令 \(nxt[i]\) 表示在 \(i\) 处失配会跳到哪里,\(f[i]\) 表示配上了前 \(i\) 为的期望答案。那么考虑前 \(i-1\) 已经配上了,第 \(i\) 位有可能配上也有可能失配,即 \(f[i-1]\to f[i], f[i-1]\to f[nxt[i-1]]\)。那么有方程 \(f[i]=2+f[i-1]-f[nxt[i-1]]-2\)。设 \(f[0]=x\) (答案),那么 \(f[i]\) 全程系数为 \(1\),求出 \(f[n]\) 的常数项即可解出 \(x\)。

求 \(nxt[i]\) 可以用 \(kmp[]\) 路径压缩也可以用AC自动机。

#include <bits/stdc++.h>
#define AC_auto 0
#define KMP 9
using namespace std;
const int N = 1e6 + 5, mod = 1e9 + 7;

char s[N];
int n, nxt[N][2], kmp[N];
int f[N];

#if AC_auto
void build() {
    nxt[0][s[1] - '0'] = 1;
    for(int i = 1; i < n; ++i) {
        nxt[i][s[i + 1] - '0'] = i + 1;
        if(i == 1) kmp[i] = 0;
        else kmp[i] = nxt[kmp[i - 1]][s[i] - '0'];
        if(!nxt[i][0]) nxt[i][0] = nxt[kmp[i]][0];
        if(!nxt[i][1]) nxt[i][1] = nxt[kmp[i]][1];
    }
}

signed main() {
#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
    freopen("Ans.txt", "w", stdout);
#endif
    scanf("%s", s + 1), n = strlen(s + 1);
    build();
    for(int i = 1; i <= n; ++i) 
        f[i] = (2LL * f[i - 1] - f[nxt[i - 1][(s[i] - '0') ^ 1]] - 2) % mod;
    printf("%lld", (mod - f[n]) % mod);
}
#endif
#if KMP
signed main() {
    scanf("%s", s + 1), n = strlen(s + 1);
    for(int i = 2, j = 0; i <= n; ++i) {
        while(j && s[j + 1] != s[i]) j = kmp[j];
        if(s[j + 1] == s[i]) ++j;
        kmp[i] = j;
    }
    for(int i = 1; i <= n; ++i) {
        while(s[kmp[i - 1] + 1] == s[i] && kmp[i - 1]) kmp[i - 1] = kmp[kmp[i - 1]];
        if(!kmp[i - 1]) f[i] = (2LL * f[i - 1] - 2) % mod;
        else f[i] = (2LL * f[i - 1] - f[kmp[i - 1] + 1] - 2) % mod;
    }
}
#endif

标签:nxt,AC,noi,10.6,int,T1,kmp,模拟
From: https://www.cnblogs.com/into-qwq/p/16757710.html

相关文章

  • P2305 [NOI2014] 购票
    P2305[NOI2014]购票设\(f_{x}\)表示从\(x\)点跳到\(1\)的最少费用。考虑\(x\)的一个祖先\(u\),有\[f_x=f_{u}+\text{dis}_{u,x}\timesp_x+q_x\]其中需要满足......
  • 2022.10.6java分支结构
    HelloWorld打开idea,新建java文件,新建javaclass编写代码psvm自动生成publicstaticvoidmain(Stringsargs{}sout自动生成System.out.printlnpublicclass......
  • JZOJ 7685. 【2022.10.06冲剌NOIP2022模拟】奇怪的函数(function)
    \(\text{Solution}\)观察到关于\(x\)的函数在\(n\)个操作之后一定是这样的:一段水平直线加上一段斜率为\(1\)的直线再加上一段水平直线于是线段树维护这个分段函数......
  • java--equals和模拟用户登录卫语句
    1.什么是卫语句卫语句就是把复杂的条件表达式拆分成多个条件表达式,减少嵌套。嵌套了好几层的if-then-else语句,转换为多个if语句,实现它的逻辑,这多条的if语句就是卫语句......
  • NOIP2015 T3 乱作题解
    题目看起来好像不是很难啊,为什么我做不出来呢;1.暴力枚举枚举x,y,z的值,再判断是否符合条件;时间复杂度:\(\mathcal{O}(n^3)\)期望得分:\(20pts\)\(Code\):#includ......
  • 玩转华为ENSP模拟器系列 | 两个网关之间通过IKE方式协商IPSec VPN隧道(采用预共享密钥
    素材来源:华为防火墙配置指南一边学习一边整理试验笔记,并与大家分享,侵权即删,谢谢支持!附上汇总贴:​​玩转华为ENSP模拟器系列|合集_COCOgsta的博客-CSDN博客_华为模拟器实验......
  • P2680 [NOIP2015 提高组] 运输计划 (树上差分-边差分)
    P2680题目的大意就是走完m条路径所需要的最短时间(边权是时间),其中我们可以把一条边的权值变成0(也就是题目所说的虫洞)。可以考虑二分答案x,找到一条边,使得所有大于x的路径......
  • 10.6开启博客的第一天
    敲的第一个完整代码求两个数的最大值#include<stdio.h>intmain(){int num1=10;intnum2=20;if(num1>num2)printf("较大值是:%d\n",num1);elseprintf("较大值是:%d\n",num......
  • ts+vite3+vue3+mock+qs实现本地模拟数据功能
    第一步:安装qs因为项目中用到了ts,所以还需要安装:第二步:安装mock第三步:创建Vue页面:Category.vue<template><button@click="getById">getById</button><button......
  • 2022.10.6scanner
    HelloWorld打开idea,新建java文件,新建javaclass编写代码psvm自动生成publicstaticvoidmain(Stringsargs{}sout自动生成System.out.printlnpublicclass......