首页 > 其他分享 >多校A层冲刺NOIP2024模拟赛04

多校A层冲刺NOIP2024模拟赛04

时间:2024-10-12 21:10:36浏览次数:1  
标签:ch 04 int 多校 len while tot printf NOIP2024

02表示法

直接递归即可,稍微写个高精。

点击查看代码
#include<bits/stdc++.h>
using namespace std;

//#define int __int128
const int N=1e4;
string s;
int b[N],c[N],len;
int a[N],tot;

int read()
{
	int f=1,s=0;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){s=(s<<1)+(s<<3)+(ch^48);ch=getchar();}
	return f*s;
}

void dfs(int x,int m)
{
	if(x<=1)
	{
		if(x==0) printf("2(0)");
		if(x==1) printf("2");
		return ;
	} 
	int pos=m;
	int d=1;
	for(int i=1;i<=m;i++)
	{
		if(x&(d<<(i-1)))
		{
			pos=i;
			break;
		}
	}
	for(int i=m;i>=1;i--)
	{
		if(!(x&(d<<(i-1)))) continue;
		if(i>2) 
		{
			printf("2(");
		}
		int y=i,tot=0;
		while(y) tot++,y=y>>1;
		dfs(i-1,tot);
		if(i>2)
		{
			printf(")");
		}
		if(i>pos) printf("+");	
	}
	return ;
}


void chu()
{
	for(int i=0;i<len;i++)
	{
		if(b[i]%2==0) b[i]/=2;
		else b[i]/=2,b[i+1]=b[i+1]+10; 
	}
	int tmp=len,cnt=0;
	int flag=1;
	for(int i=0;i<len;i++)
	{
		if(b[i]==0&&flag) 
		{
			tmp--;
			continue;
		}
		if(b[i]!=0) flag=0;
		c[++cnt]=b[i];
	}
	len=tmp;
	cnt=0;
	for(int i=0;i<len;i++) b[i]=c[++cnt];
}

signed main()
{
	freopen("pow.in","r",stdin);
	freopen("pow.out","w",stdout);
	cin>>s;
	len=s.size();
	for(int i=0;i<len;i++) b[i]=s[i]-'0';
	
	while(len!=0)
	{
		a[++tot]=(b[len-1]&1);
		chu();
	}
	int pos=tot;
	for(int i=1;i<=tot;i++)
	{
		if(a[i]==1)
		{
			pos=i;
			break;
		}
	}
	for(int i=tot;i>=1;i--)
	{
		if(a[i]==0) continue;
		if(i>2) 
		{
			printf("2(");
		}
		int y=i,tot=0;
		while(y) tot++,y=y>>1;
		dfs(i-1,tot);
		if(i>2)
		{
			printf(")");
		}
		if(i>pos) printf("+");
	}
}

子串的子串

考虑二维前缀和直接容斥,再用 \(hash\) 优化一下复杂度。

点击查看代码
#include<bits/stdc++.h>
using namespace std;

#define int unsigned long long
const int N=4e3+107;
int n,q;
int ans[N][N];
string s;
unordered_map<int,int>mp;
int cnt=0;

const int base=137;
int p[N],has[N];
int get_hash(int l,int r)
{
	return has[r]-has[l-1]*p[r-l+1];
}

int read()
{
	int f=1,s=0;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){s=(s<<1)+(s<<3)+(ch^48);ch=getchar();}
	return f*s;
}

signed main()
{
	freopen("substring.in","r",stdin);
	freopen("substring.out","w",stdout);
	n=read(),q=read();
	cin>>s;s=' '+s;
	p[0]=1;
	for(int i=1;i<=n;i++) p[i]=p[i-1]*base;
	for(int i=1;i<=n;i++) has[i]=has[i-1]*base+s[i];
	for(int len=1;len<=n;len++)
	{
		mp.clear();
		for(int l=1;l+len-1<=n;l++)
		{
			int r=l+len-1;
			int tmp=get_hash(l,r);
			ans[mp[tmp]][r]--;
			mp[tmp]=l;
		}
	}
	for(int l=n;l>=1;l--)
		for(int r=l;r<=n;r++)
			ans[l][r]+=ans[l+1][r]+ans[l][r-1]-ans[l+1][r-1]+1;

	for(int i=1;i<=q;i++)
	{
		int l=read(),r=read();
		printf("%lld\n",ans[l][r]);
	}
}

魔法咒语

正反分别建一颗trie树。直接看题解吧,挺详细的。

点击查看代码
#include<bits/stdc++.h>
using namespace std;

#define int long long
const int N=3e5+107;
const int base=137;
string s[N];
int n,len[N];
bool flag[N],vis[N];
struct lmy
{
	int n,tr[N][26];
	int cnt[26];
	void insert(string s,bool vis)
	{
		int rt=0,len=s.length();
		if(!vis)
		{
			for(int i=0;i<len;i++)
			{
				int ch=s[i]-'a';
				if(!tr[rt][ch]) tr[rt][ch]=++n;
				rt=tr[rt][ch];
			}
		}
		else
		{
			for(int i=len-1;i>=0;i--)
			{
				int ch=s[i]-'a';
				if(!tr[rt][ch]) tr[rt][ch]=++n,++cnt[ch];
				rt=tr[rt][ch];
			}
		}
	}
}tr1,tr2;

int read()
{
	int f=1,s=0;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){s=(s<<1)+(s<<3)+(ch^48);ch=getchar();}
	return f*s;
}

signed main()
{
	freopen("magic.in","r",stdin);
	freopen("magic.out","w",stdout);
	n=read();
	tr1.n=tr2.n=0;
	int ans=0;
	for(int i=1;i<=n;i++)
	{
		cin>>s[i];
		tr1.insert(s[i],0);
		tr2.insert(s[i],1);
		int len=s[i].length();
		vis[s[i][len-1]-'a']=1;
		if(len==1&&!flag[s[i][0]-'a']) ans++,flag[s[i][0]-'a']=1;
	}
	for(int i=1;i<=tr1.n;i++)
	{
		for(int x=0;x<26;x++)
		{
			if(!tr1.tr[i][x]) ans+=tr2.cnt[x];
			else if(vis[x]) ans++;
		}
	}
	printf("%lld\n",ans);
}

标签:ch,04,int,多校,len,while,tot,printf,NOIP2024
From: https://www.cnblogs.com/zhengchenxi/p/18461491

相关文章

  • 多校A层冲刺NOIP2024模拟赛05
    好数(number没啥好说的直接\(O(n^2)\)枚举即可。点击查看代码#include<bits/stdc++.h>usingnamespacestd;constintN=2e6+107;constintd=2e5;intn,a[N],sum[N];intread(){ intf=1,s=0;charc=getchar(); while(c<'0'||c>'9'){if(c==�......
  • 力扣数据库1045. 买下所有产品的客户
    一、数据1045.买下所有产品的客户-力扣(LeetCode)Customer 表:+-------------+---------+|ColumnName|Type|+-------------+---------+|customer_id|int||product_key|int|+-------------+---------+该表可能包含重复的行。customer_id不......
  • [46] (多校联训) A层冲刺NOIP2024模拟赛06
    HDK在与mt19937_64先生的石头剪刀布比赛中拿下十一连败的好成绩你也来试试吧#include<bits/stdc++.h>usingnamespacestd;#include"include/hdk/rand.h"usingnamespacehdk::Rand;chargetchar_(){charch=getchar();if(ch>='a'andch<='z......
  • 多校A层冲刺NOIP2024模拟赛06
    rank19,T1100pts,T230pts,T345pts,T420ptsT1小Z的手套(gloves)二分答案,贪心匹配\(O(n\logn)\)的check即可。时间复杂度\(O(n\log^2n)\)点此查看代码#include<bits/stdc++.h>#include<bits/extc++.h>//usingnamespace__gnu_pbds;//usingnamespace__gnu_cxx;usi......
  • Ubuntu20.04安装unifi网络服务器
    1、更新软件和系统sudoaptupdate&&sudoapt-yfull-upgrade2、添加存储库所需的依赖项sudoaptinstallcurlgpggnupg2software-properties-commonapt-transport-httpslsb-releaseca-certificates 3、将GPG密钥添加到您的系统密钥环中 curl-fsSLhttps://pgp......
  • 五上数学10月份月考情况反馈204班
    五上数学10月份月考情况反馈204班本周进行了数学第一单元的综合练习,已经进行了讲评。试卷已经下发,请学生带回家改完错误,家长签字。签字在试卷的左上角,签字示范:家长阅,10月12日,或者再写一些建议与意见都可以。下面分析一下考试情况:10月份月考内容:以第一第二单元为主下面是具体......
  • P1043 [NOIP2003 普及组] 数字游戏
    链接:https://www.luogu.com.cn/problem/P1043题面:思路:区间dp,设dpmax/dpmin[i][j][k]表示从序列i->j分成k份的最大/最小值,然后根据递推公式dpmin[i][j][m]=min(dpmin[i][j][m],dp[i][k][mi]*dp[k+1][j][m-mi]),for∀mi∈[1,m),k∈[i,j)注意不用取模,因为求出来的就已经是相......
  • 题解 QOJ5048【[ECFinal19K] All Pair Maximum Flow】
    题目描述给你一个\(n\)个点\(m\)条边的图,它是平面上的正\(n\)边形和一些对角线,节点按逆时针方向编号为\(1\)到\(n\)。对角线只可能在节点处相交。每条边有一个容量,求每个点对之间的最大流的和。\(n\leq200000,m\leq400000\)。solution做法每次找出边权最小的边\(......
  • 104th 2024/10/8 模拟赛总结60
    T1有感觉,因为AB组一起打,所以下意识认为是水题(实际上也不算难?)就直接开始想从深向浅直接扫一遍,能转就转显然错,从浅向深扫一遍同样不对,因为不知道往上转移的顺序比如,设该点为x,是0,有的儿子可能转移到x,其子树内转移的次数比另一个儿子多,所以就要优先它不好处理,看到数据,给了一档2e5,一......
  • 10.11日noip多校联考总结
    10.11日noip多校联考总结T1看到感觉像是一个很玄学的题目,在考场上推了大概一个多小时,又写了大概半个小时,终于调出来了。谨记:三分取mid需要进行浮点数运算。对于每一行和每一列定义两个数组来记录要加多少,因为我们只需要知道其中任意一个数就可以推出所有的数,那么考虑枚举x0,来......