NOIP 模拟 7
1.CSP 模拟 02.CSP 模拟 13.CSP 模拟 24.CSP 模拟 35.CSP 模拟 46.CSP 模拟 57.CSP 模拟 68.CSP 模拟 79.CSP 模拟 810.CSP 模拟 911.CSP 模拟 1012.CSP 模拟 2413.CSP 模拟 2514.CSP 模拟 2615.CSP 模拟 2716.CSP 模拟 2817.CSP 模拟 2918.CSP 模拟 3019.CSP 模拟 3120.CSP 模拟 3221.CSP 模拟 3322.CSP 模拟 3423.CSP 模拟 3524.CSP 模拟 3625.CSP 模拟 3726.CSP 模拟 3827.CSP 模拟 3928.CSP 模拟 4029.CSP 模拟 4130.CSP 模拟 4231.CSP 模拟 4332.CSP 模拟 4433.CSP 模拟 4534.CSP 模拟 4635.CSP 模拟 4736.CSP 模拟 4837.CSP 模拟 4938.CSP 模拟 5039.CSP 模拟 5140.CSP 模拟 5241.CSP 模拟 5342.CSP 模拟 5443.NOIP 模拟 144.NOIP 模拟 245.NOIP 模拟 346.NOIP 模拟 447.NOIP 模拟 548.NOIP 模拟 6
49.NOIP 模拟 7
50.NOIP 模拟 851.NOIP2024(欢乐)加赛 352.NOIP 模拟 953.NOIP 模拟 1054.NOIP 模拟 1155.NOIP 模拟 1256.NOIP 模拟 1357.NOIP 模拟 1458.NOIP 模拟 1559.NOIP 模拟 1660.NOIP 模拟 17T1 图书管理 (book)
考虑每个数做中位数的贡献,经典 trick
就是小于的为
T2 两棵树 (tree)
又是经典 trick
,森林的连通块数为点数减边数,证明就是算树的数量,好像之前见过这个 trick
。
然后把贡献拆开,
, 中的 点在,则 中的 点一定不在,两个点的概率是 ,总贡献是 。 边数都是 ,三个点的概率是 ,总贡献 ,直接枚举边 ,然后减去 即可,如果 在另一棵树中也有连边,就多减了一个,加 即可。
为啥把前面贡献直接算完后面循环算没有全循坏快,
T3 函数(fun)
自然地想到 01trie
,对于异或完等于
否则一定两边异号,如果第一个数异或完大于
T4 编辑(edit)
原题:QOJ5312
编辑距离确实是一个专有名词,可以使用 LCS 的思想来求解,
然后枚举起点就可以做到
发现上面的东西必须要以
注意这里的操作都是在 T 串上的操作,对于 S 的操作,意义换一下式子也一样。
#include<bits/stdc++.h> #define fi first #define se second #define pii std::pair<int,int> #define eb emplace_back #define pb push_back typedef long long ll; typedef unsigned long long ull; std::mt19937 myrand(std::chrono::high_resolution_clock::now().time_since_epoch().count()); inline int R(int n){return myrand()%n+1;} inline int read(){char ch=getchar();int x=0,f=1;for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;for(;ch>='0'&&ch<='9';ch=getchar())x=(x<<3)+(x<<1)+(ch^48);return x*f;} const int N=1e5+10,mod=998244353,inf=1e9,P=17771; inline void Min(int &x,int y){if(x>y)x=y;} inline void Max(int &x,int y){if(x<y)x=y;} int K,n,m,f[35][70],ans[N]; ull hs[2][N],p[N]; char s[N],t[N]; inline int get(int l,int r,int id){return hs[id][r]-hs[id][l-1]*p[r-l+1];} inline int LCP(int x,int y){ if(x<0||x>n||y<0||y>m)return 0; int l=1,r=std::min(n-x+1,m-y+1),res=0; while(l<=r){ int mid=l+r>>1; if(get(x,x+mid-1,0)==get(y,y+mid-1,1))l=mid+1,res=mid; else r=mid-1; }return res; } signed main(){ // freopen("edit.in","r",stdin);freopen("edit.out","w",stdout); // freopen("in.in","r",stdin);freopen("out.out","w",stdout); std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0); std::cin>>K>>s+1>>t+1;n=strlen(s+1),m=strlen(t+1); p[0]=1;for(int i=1;i<=std::max(n,m);++i)p[i]=p[i-1]*P; for(int i=1;i<=n;++i)hs[0][i]=hs[0][i-1]*P+s[i]-'a'+1; for(int i=1;i<=m;++i)hs[1][i]=hs[1][i-1]*P+t[i]-'a'+1; for(int st=1;st<=m;++st){ for(int i=0;i<=K;++i)for(int j=0;j<=2*K;++j)f[i][j]=0; f[0][K]=0; for(int i=0;i<=K;++i)for(int j=-i;j<=i;++j){ f[i][j+K]+=LCP(f[i][j+K]+1,f[i][j+K]+st+j); if(i!=K) Max(f[i+1][j+K-1],std::min(f[i][j+K]+1,n)), Max(f[i+1][j+K],std::min(f[i][j+K]+1,n)), Max(f[i+1][j+K+1],f[i][j+K]); } for(int j=std::max(-K,1-n);j<=std::min(K,m-st-n+1);++j) for(int i=0;i<=K;++i)if(f[i][j+K]>=n){ans[i]++;break;} }for(int i=0;i<=K;++i)std::cout<<ans[i]<<'\n'; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!