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

多校A层冲刺NOIP2024模拟赛04

时间:2024-10-10 08:52:29浏览次数:1  
标签:string 04 int 多校 long -- maxn ans NOIP2024

A. 02表示法

对要求的数二进制拆分,每一位递归求解,大于2就继续拆,是1返回 \(2(0)\) ,是2返回 \(2\),由于外层的数比较大,所以

要写一个高精除低精

点击查看代码
#include<bits/stdc++.h>
#define int long long
const int maxn=1e5+10;
using namespace std;
int n,ans[maxn],top;
string s,t;

void pre(string s)
{
	s=" "+s;
	t=" "+t;
	while(s[1]-'0'>0||s.size()>1)
	{
		int len=s.size()-1,x=0,cnt=0,i;
		for(i=1;i<=len&&s[i]=='0';i++); 
		for(;i<=len;i++)
		{
			x=x*10+s[i]-'0';
			int z=x/2;
			t=t+(char)(z+'0');
			x=x-(t[++cnt]-'0')*2;
		}
//		cout<<s<<endl; 
		s=t;t=" "; 
		ans[++top]=x;	 
	}
}
void lsx(int x)
{
	if(x>1)
	{
		int cnt=0;
		for(int i=62;i>=0;i--) if((1ll<<i)&x) cnt++;
		cout<<2<<"(";
		for(int i=62;i>=0;i--)
		{
			if((1ll<<i)&x)
			{
				lsx(i);
				if(--cnt) cout<<"+";
				
			}			
		}
		cout<<")";
	}
	else
	{
		if(x==1)cout<<2;
		else cout<<"2(0)";
		return ;
	}
}

signed main()
{
	freopen("pow.in","r",stdin);
	freopen("pow.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>s;
	pre(s);
	int i,temp,sum=0; 
	for(i=top;i>=1&&ans[i]==0;i--);temp=i;
	for(i=temp;i>=1;i--) if(ans[i]==1)sum++;
	for(i=temp;i>=1;i--)
	{
		if(ans[i]==1)
		{
			lsx(i-1);
			if(--sum) cout<<"+";
		}			
	}

	return 0;
}
/*
261770307610118667978710393358
*/

B. 子串的子串

由于子串中有重复的,我们假设有两个相邻的重复字串 \(s1(l1,r1),s2(l2,r2)\),所以我们枚举长度,再枚举左端点,对每一个

相邻的重复子串的 \(l1-r2\) 减一,再用二维前缀和求出每个区间的答案,这样就相当于对于每一对相邻的重复子串,把靠后的那

个删掉,只保留第一个,这样不管后面是否有重复字串,加进来一个影响就消掉一个。

点击查看代码
#include<bits/stdc++.h>
#define int unsigned long long
const int base=133; 
const int maxn=3010;
using namespace std;
int n,q,ha[maxn],po[maxn],ans[maxn][maxn];
string s;
unordered_map<int,int>mp;
int jie(int l,int r)
{
	return ha[r]-ha[l-1]*po[r-l+1];
}

signed main()
{
	freopen("substring.in","r",stdin);
	freopen("substring.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n>>q;
	cin>>s;s=" "+s;
	po[0]=1;
	for(int i=1;i<=n;i++)ha[i]=ha[i-1]*base+s[i],po[i]=po[i-1]*base;
	for(int len=1;len<=n;len++)
	{
		mp.clear(); 
		for(int l=1;l+len-1<=n;l++)
		{
			int r=l+len-1;
			int tem=jie(l,r);
			ans[mp[tem]][r]--;
			mp[tem]=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 x,y;
		cin>>x>>y;
		cout<<ans[x][y]<<'\n';
	}

	return 0;
}
/*

*/

C. 魔法咒语

题解说的听明白的,直接粘了
image

点击查看代码
#include<bits/stdc++.h>
#define int long long
const int maxn=2e5+10;
using namespace std;
int n,ans;
string s[maxn];
bool flag[26],vis[26];

struct lsx
{
	int tr[maxn][26],cnt[maxn],n;
	lsx():n(0){}
	void insert(string s,bool k)
	{
		int p=0;
		if(k)
		{
			for(int i=0;i<s.size();i++)
			{
				int t=s[i]-'a';
				if(!tr[p][t]) tr[p][t]=++n;
				p=tr[p][t];
			}
		}
		else
		{
			for(int i=s.size()-1;i>=0;i--)
			{
				int t=s[i]-'a';
				if(!tr[p][t]) tr[p][t]=++n,cnt[t]++;
				p=tr[p][t];
			}
		}
	}
}t1,t2;

signed main()
{
	freopen("magic.in","r",stdin);
	freopen("magic.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>s[i];
		t1.insert(s[i],1);
		t2.insert(s[i],0);
		flag[s[i][s[i].size()-1]-'a']=1;
		if(s[i].size()==1&&!vis[s[i][0]-'a']){ans++,vis[s[i][0]-'a']=1;}
	}
//	return 0;
	for(int i=1;i<=t1.n;i++)
	{
		for(int j=0;j<=25;j++)
		{
			if(!t1.tr[i][j])
			{
				ans+=t2.cnt[j];
//				cout<<i<<" "<<j<<endl;
			}
			else if(flag[j])ans++;
		}
	}
	cout<<ans<<'\n';

	return 0;
}
/*

*/

stars

image

标签:string,04,int,多校,long,--,maxn,ans,NOIP2024
From: https://www.cnblogs.com/oceansofstars/p/18455532

相关文章

  • 在Ubuntu 24.04中更换为清华源的步骤
    在Ubuntu24.04中更换为清华源的步骤‌1.备份原有的源配置文件‌:从Ubuntu24.04开始,Ubuntu的软件源配置文件变更为DEB822格式,路径为/etc/apt/sources.list.d/ubuntu.sources。打开终端,输入以下命令来备份原有的源配置文件:sudo cp /etc/apt/sources.list......
  • 「模拟赛」A 层多校联训 4(卖品:CTH)
    双倒一啦!感觉这次最大的错误就是没看T2。(本质原因还是时间浪费的太多了)赛时记录在闲话啦accoder多校比赛链接02表示法唐诗题!考高精的人都\(**\),输出深度优先搜索解决。高精乘2、高精减。子串的子串官方题解写的不好,放一下Ratio的好吃题解:意思就是:\(ans_{l,r-1}\)......
  • 代码随想录算法训练营day10| 232.用栈实现队列 225. 用队列实现栈 20. 有效的括
    学习资料:https://programmercarl.com/栈与队列理论基础.html栈与队列学习记录:232.用栈实现队列(两个栈(stack_in,stack_out)实现一个队列的行为)点击查看代码classMyQueue(object):def__init__(self):self.stack_in=[]self.stack_out=[]d......
  • Codeforces Round 804 (Div. 2)(C - D)
    CC观察题意,模拟样例,首先\(0\)不能动,因为相邻的\(mex\)会改变,然后\(1\)也是如此,所以我们固定了\(0\)和\(1\),设两个指针\(l\)和\(r\)表示固定的位置,那么此时在他们两个中间的数可以随便移动,假设有\(x\)个空位,那么如果\(2\)在里面,\(2\)的选......
  • 多校 A 层冲刺 NOIP2024 模拟赛 04
    多校A层冲刺NOIP2024模拟赛04T02表示法签到题记得有一道普及题是没加高精的原吧...将原数高精除变为二进制,然后记搜就好了。T子串的子串签到题注意到\(n\)很小支持\(O(n^2)\)的操作,可以直接预处理出所有\(l,r\)的个数,预处理方式可参考数颜色一题,对于相同的子串只记......
  • 多校A层冲刺NOIP2024模拟赛03
    T1.colorfu正难则反,直接枚举横行,枚举右边界,如果相同,则会对后面以及它本身统计产生\(1\)的贡献,我们直接开个桶统计一下。点击查看代码#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=1000+107;intn,m;inta[N][N],cnt[N*N];intsum;......
  • [44] (多校联训) A层冲刺NOIP2024模拟赛04
    A.02表示法这题放在ABCD题我可能不会奇怪,但是它放模拟赛T1了赛时代码#include<bits/stdc++.h>usingnamespacestd;classnum_string{ private: stringx; inlinevoiddevided_2(){ stringans="";intnow=0; for(inti=0;i<=(int)x.length()-1;++i){ ......
  • 多校A层冲刺NOIP2024模拟赛04
    多校A层冲刺NOIP2024模拟赛04学校OJ赛时rank28,T10pts,T2100pts,T320pts,T425ptsaccodersrank15,T1100pts,T2100pts,T320pts,T425pts不是,也没人告诉我两个OJ文件名不一样啊02表示法递归+高精除低精。点此查看代码#include<bits/stdc++.h>#include<bits/extc++.h>//......
  • 『模拟赛』多校A层冲刺NOIP2024模拟赛04
    Rank赤石场。A.02表示法签。若干天前在洛谷随到过,不过当时只看了眼讨论区就走了www还好本来不是很难。发现大体上是一个拆分二的幂的问题,从大到小枚举2的幂,判断有没有这个幂只用比较大小关系,然后再对指数做一个同样的操作,递归至不大于2为止,注意\(2^1\)不用输出(1......
  • 多校A层冲刺NOIP2024模拟赛04
    多校A层冲刺NOIP2024模拟赛04\(T1\)A.02表示法\(0pts/100pts\)弱化版:luoguP1010[NOIP1998普及组]幂次方递归模拟即可,二进制分解时需要写高精除低精。点击查看代码intr[810],t[810];chars[810],id[810][10];stringa;intchu(chars[]){ intn=strlen(s......