首页 > 其他分享 >NOIP2024模拟赛13:拆开未来

NOIP2024模拟赛13:拆开未来

时间:2024-06-22 17:21:17浏览次数:19  
标签:13 AB int 拆开 枚举 solve NOIP2024

NOIP2024模拟赛13:拆开未来

C-重复

  • 一句话题意:给定字符串 \(S\), 问 \(S\) 的所有子串共有多少种“好的拆分方案”。对于一个字符串 \(S\), 一个划分是好的当且仅当能把 \(S\) 划分成 6 个非空子串 \(a,b,c,d,e\), 满足 \(a=b=e, \ c=f\) (一个字符串可能有多种划分方式)

  • 标签:前缀和,思维,散列表(哈希)

  • 简化一下就是要满足 \(AABCAB\).

  • 60分的暴力是对每一个区间枚举开头的 \(A\) 和结尾的 \(B\). (P.S.模数设 \(998244353\) 会被卡!!!)

    const int N=5005;
    const ll P=131;
    ull h[N],p[N];
    char s[N];
    int n; ll ans=0;
    ull get(int l,int r){ return h[r]-h[l-1]*p[r-l+1]; }
    void solve(int l,int r){
    	int len=r-l+1;
    	F(i,1,len/3) for(int j=1;j<=len/2 && 3*i+2*j<len;++j){
    			ull A=get(l,l+i-1),B=get(l+i,l+2*i-1),C=get(l+2*i,l+2*i+j-1),E=get(r-i-j+1,r-j),F=get(r-j+1,r); 
    			if(A == B && B == E && C == F) ++ans;
    		}
    }
    signed main(){
    	freopen("c.in","r",stdin); freopen("c.out","w",stdout);
    	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    	cin>>(s+1); n=strlen(s+1); p[0]=1;
    	F(i,1,n) h[i]=h[i-1]*P+s[i]-'0',p[i]=p[i-1]*P;
    	F(l,1,n) F(r,l+5,n) solve(l,r);
    	cout<<ans;
    	return 0;
    }
    
  • 但正如邓老师所说,这种拆分方式是“不平衡的”,虽然我们可以用 \(O(1)\) 的时间去检查剩下的位置,但我们却需要花 \(O(N^2)\) 的时间枚举所有的首尾情况。

  • 所以正解我们选择枚举 \(AB\). 枚举 \(A\) 的左端点 \(i\) 和 \(B\) 的右端点 \(j\).

  • 对于 \(AA\), 在固定 \(i\) 的情况下可以用前缀和处理所有贡献。

  • 对于 \(AB\) 和后面那个 \(AB\) 的匹配, 把所有已经扫到过的 \(AB\) 存进一个散列表并统计其个数(\(unorderedmap\) 会 T掉)

  • 两者的贡献相乘即是单次的总贡献。

  • 注意循环的初末条件,\(C\) 不为空(详见代码)

#include<bits/stdc++.h>
#define F(i,l,r) for(register int i(l);i<=r;++i)
using namespace std;
using ll = long long;
using ull = unsigned long long;
const int N=5005;
const ll P=131;
ull h[N],p[N];
char s[N];
int n; ll ans=0;
ull get(int l,int r){ return h[r]-h[l-1]*p[r-l+1]; }
void solve(int l,int r){
	int len=r-l+1;
	F(i,1,len/3) for(int j=1;j<=len/2 && 3*i+2*j<len;++j){
			ull A=get(l,l+i-1),B=get(l+i,l+2*i-1),C=get(l+2*i,l+2*i+j-1),E=get(r-i-j+1,r-j),F=get(r-j+1,r); 
			if(A == B && B == E && C == F) ++ans;
		}
}
signed main(){
	freopen("c.in","r",stdin); freopen("c.out","w",stdout);
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	cin>>(s+1); n=strlen(s+1); p[0]=1;
	F(i,1,n) h[i]=h[i-1]*P+s[i]-'0',p[i]=p[i-1]*P;
	F(l,1,n) F(r,l+5,n) solve(l,r);
	cout<<ans;
	return 0;
}

标签:13,AB,int,拆开,枚举,solve,NOIP2024
From: https://www.cnblogs.com/superl61/p/18262528

相关文章

  • LeetCode 134加油站,是环路,但我不绕圈,秒了。
    不绕圈是指,不需要看能不能转一圈回到起始点,只需要看能不能到达最后一个元素就行。在做这一道题的时候,如果判断能不能回到出发点,则需要绕一圈再回来,不仅需要创建临时变量,还要频繁使用%n获得余数,非常的不优雅。下面是优化方法:由题目很容易得出,如果存在解,则必定有gas总和大于......
  • ch13 半监督学习
    未标记样本在生产活动中,有样本的数目会很少(因为标记很昂贵),从LLM的成功来看,在unlabeleddata上训练模型是很有希望的。这种方法被称为半监督学习。半监督学习又分为纯半监督学习和直推学习纯半监督学习强调从unlabeleddata中学习出一个好的模型直推学习强调从labeled......
  • HC32L130 外部IO中断
    1.HC32L130外部端口PB2#include"app_SD3078.h"#defineRCC_RTC_INT_PORT SysctrlPeripheralGpio /*GPIO端口时钟*/#definePORT_RTC_INT GpioPortB /*GPIO端口*/#definePIN_RTC_INT GpioPin2 /*GPIO引脚*/voidApp_RTC_INTInit(void){stc_gpio_cfg_......
  • HC32L130/HC32L136开发之软件模拟IIC驱动AT24C64
    一、AT24C64电路图二、程序编码1.定义I2C总线连接的GPIO端口/*定义I2C总线连接的GPIO端口,用户只需要修改下面4行代码即可任意改变SCL和SDA的引脚*/#defineRCC_I2C_PORT   SysctrlPeripheralGpio      /*GPIO端口时钟*/#definePORT_I2C_SCL  ......
  • HC32L130读取SD3078时间
    一.SD3078电路图二.HC32L130IO模拟IIC 1.app_i2c_gpio.h/*****************************************************************************//**\fileapp_i2c_gpio.h****Headerfileforlcdfunctions******History:**-2024-06-21马天义微信:......
  • 第13章.创建MDK工程-基于标准库版
    目录0.《STM32单片机自学教程》专栏13.1新建本地工程文件夹13.2新建工程13.2.1新建工程13.2.2新建组13.2-3添加文件 13.3配置魔术棒选项卡13.3.1Output选项卡13.3.2C/C++选项配置 13.3.3Dubug选项配置13.4使用标准库点亮LED参考资料:0.《STM32......
  • 打卡信奥刷题(132)用Scratch图形化工具信奥P9913 [普及组]「RiOI-03」water problem
    「RiOI-03」waterproblem题目描述给定一个正整数nnn,问一个正方形能否被分割为nn......
  • C# 13(.Net 9) 中的新特性 - 扩展类型
    C#13即.Net9按照计划会在2024年11月发布,目前一些新特性已经定型,今天让我们来预览一个比较大型比较重要的新特性:扩展类型Extensiontypes在5月份的微软Build大会中的What’snewinC#13会议上,两位大佬花了很长的篇幅来演示这个特性。这个特性一直是大家很关心的,在g......
  • Python 学习 第三册 第13章 动态规划
    ----用教授的方式学习目录13.1 又见斐波那契数列13.2 动态规划与 0/1 背包问题13.3 动态规划与分治算法13.1 又见斐波那契数列一个很直观的斐波那契数列的递归实现:deffib(n):    """假设n是非负整数返回第n个斐波那契数"""    ifn==0o......
  • m2_day13 [项目周]
    课程内容:GUI图形用户界面监听攻略GUIGUI=>G=图形U=用户I=接口​图形用户接口=用户图形界面...​java.awt.*; Button重量级组件javax.swing.*;JButton轻量级组件​常见的6个步骤:1.选择容器Container和组件Component......