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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【蓝桥杯】子串分值---笔记

發布時間:2025/3/21 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【蓝桥杯】子串分值---笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述


1 ≤ n ≤ 100000。

仔細讀題,當字符串為“ababc”,具體實現題意為:

子串 f
a 1
ab 2
aba 1
abab 0
ababc 1
b 1
ba 2
bab 1
babc 2
a 1
ab 2
abc 3
b 1
bc 2
c 1

首先可以想到利用暴力解法,雙重循環枚舉字符串起始于終止位置,之后再對這個子串進行判斷,復雜度O(n^2)。n最大為1e6。計算機一秒運算1e8-1e9次,題目限制時間復雜度1s,所以明顯超時,有些數據點過不了。
可以觀察列表,觀察每個字符的作用域,即對f的值貢獻1。每個字符的作用域為前一個字符到后一個字符之間。每個字符的作用域即前一個相同字符到該字符的距離乘以該字符到后一個相同字符的距離。樣例中a,b,a,b,c貢獻值分別為2 4 6 4 5。

代碼如下

#include<bits/stdc++.h> using namespace std; int pre[100000+5]; int last[100000+5]; string s; int ans=0; int main() {cin>>s;int mast[30];//記錄最近的一個memset(mast,-1,sizeof mast); //記錄前一個最進的位置for(int i=0;i<s.length();i++){int m=s[i]-'a';//字符對應的唯一映射數值pre[i]=mast[m]; mast[m]=i;//記錄最新的位置,下次相同字符的最近的即為mast[m],下同}for(int i=0;i<=26;i++)mast[i]=s.length(); //記錄該字符后一個最近的位置for(int i=s.length()-1;i>=0;i--){int m=s[i]-'a';last[i]=mast[m];mast[m]=i;}for(int i=0;i<s.length();i++){ans+=((i-pre[i])*(last[i]-i));}cout<<ans<<endl;return 0; }

算法參考
https://blog.csdn.net/qq_56173569/article/details/114907825

總結

以上是生活随笔為你收集整理的【蓝桥杯】子串分值---笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

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