日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Acwing第 42 场周赛【完结】

發布時間:2025/3/20 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Acwing第 42 场周赛【完结】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

老了,廢了。該remake了。

目錄

  • 4311. 最小值【簽到】
  • 4312. 出現次數【前綴和 / KMP】
  • 4313. 滿二叉樹等長路徑【遞歸 / 貪心】

4311. 最小值【簽到】

#include<bits/stdc++.h> using namespace std; int n,m; double ans=1e9,a,b; int main(void) {cin>>n>>m;for(int i=0;i<n;i++) cin>>a>>b,ans=min(ans,a/b);printf("%.6lf\n",m*ans);return 0; }

4312. 出現次數【前綴和 / KMP】


用的KMP獲得位置,然后保存排序。
每次詢問暴力查找,但過了r的時候break
比賽的時候想的前綴和,但是那個邊界處理沒想明白。

#include<bits/stdc++.h> using namespace std; const int N=1e5*2+10; int n,m,k,s[N]; char a[N],b[N];//讓其下標從1開始 int ne[N];//ne[i]表示前i個字符的最長的相等的前后綴 vector<pair<int,int>>ve; void init() {for(int i=2,j=0;i<=n;i++){while(j&&a[i]!=a[j+1]) j=ne[j];if(a[i]==a[j+1]) j++;ne[i]=j;}for(int i=1,j=0;i<=m;i++){while(j&&b[i]!=a[j+1]) j=ne[j];if(b[i]==a[j+1]) j++;if(j==n)//求a在b出現的所有的位置{ve.push_back({i-n+1,i});j=ne[j];}} } int main(void) {cin>>m>>n>>k;cin>>b+1>>a+1;init();sort(ve.begin(),ve.end());while(k--){int l,r; scanf("%d%d",&l,&r);int cnt=0;for(int i=0;i<ve.size();i++){int x=ve[i].first,y=ve[i].second;if(l<=x&&y<=r) cnt++;if(y>r) break;}printf("%d\n",cnt);}return 0; }

前綴和做法:我們將子串的開頭作為標識。
故求 [l,r] 內的子串個數等于s[r-b.size()+1]-s[l-1]

#include<bits/stdc++.h> using namespace std; const int N=1e5*2+10; int n,m,k,s[N]; string a,b; int main(void) {cin>>m>>n>>k;cin>>a>>b;a="0"+a;for(int i=1;i<a.size();i++){s[i]=s[i-1];if(a.substr(i,b.size())==b) s[i]++;}while(k--){int l,r; scanf("%d%d",&l,&r);r=r-b.size()+1;if(r<l) cout<<0<<endl;else cout<<s[r]-s[l-1]<<endl;}return 0; }

4313. 滿二叉樹等長路徑【遞歸 / 貪心】

//遞歸加貪心,因為是路徑和,只要父節點增加, //對應的子節點都會增加,所以只要把每個子節點搞成相同的即可。 #include<bits/stdc++.h> using namespace std; const int N=1e4+10; int w[N],n,ans; int dfs(int u)//子樹到u的距離 {if(u>=pow(2,n+1)) return 0;int l=dfs(u*2)+w[u*2];int r=dfs(u*2+1)+w[u*2+1];ans+=abs(l-r);//倆子樹弄成相同的值的花費return max(l,r); } int main(void) {cin>>n;for(int i=2;i<pow(2,n+1);i++) cin>>w[i];dfs(1);cout<<ans;return 0; }

總結

以上是生活随笔為你收集整理的Acwing第 42 场周赛【完结】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。