【蓝桥杯】子串分值---笔记
生活随笔
收集整理的這篇文章主要介紹了
【蓝桥杯】子串分值---笔记
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目描述
1 ≤ n ≤ 100000。
仔細(xì)讀題,當(dāng)字符串為“ababc”,具體實(shí)現(xiàn)題意為:
子串 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
首先可以想到利用暴力解法,雙重循環(huán)枚舉字符串起始于終止位置,之后再對這個(gè)子串進(jìn)行判斷,復(fù)雜度O(n^2)。n最大為1e6。計(jì)算機(jī)一秒運(yùn)算1e8-1e9次,題目限制時(shí)間復(fù)雜度1s,所以明顯超時(shí),有些數(shù)據(jù)點(diǎn)過不了。
可以觀察列表,觀察每個(gè)字符的作用域,即對f的值貢獻(xiàn)1。每個(gè)字符的作用域?yàn)榍耙粋€(gè)字符到后一個(gè)字符之間。每個(gè)字符的作用域即前一個(gè)相同字符到該字符的距離乘以該字符到后一個(gè)相同字符的距離。樣例中a,b,a,b,c貢獻(xiàn)值分別為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];//記錄最近的一個(gè)memset(mast,-1,sizeof mast); //記錄前一個(gè)最進(jìn)的位置for(int i=0;i<s.length();i++){int m=s[i]-'a';//字符對應(yīng)的唯一映射數(shù)值pre[i]=mast[m]; mast[m]=i;//記錄最新的位置,下次相同字符的最近的即為mast[m],下同}for(int i=0;i<=26;i++)mast[i]=s.length(); //記錄該字符后一個(gè)最近的位置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
總結(jié)
以上是生活随笔為你收集整理的【蓝桥杯】子串分值---笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【洛谷】马的遍历--广度优先搜索(BFS
- 下一篇: 【洛谷】选数---深度优先搜索+单调不降