【藍橋杯】每日練習 Day12 貢獻法

前言

今天給大家帶來兩道貢獻法的問題,先來講一下什么是貢獻法

貢獻法,與其說是一種算法,不如說是一種數學方法,是一種思維方式

先來給大家舉個例子,假設現在有個問題,需要你在一個只有小寫字母的字符串中查找所有僅包含一個字符a子串數量

暴力的話是枚舉所有子串,O(n^2)顯然不符合我們的預期,那么有什么方法優化呢?

這就要用到我們今天要講的貢獻法了,這一種橫看成嶺側成峰的算法,我們來觀察下面的樣例。

bbbbbacccc

可以發現在中間位置出現了a,我們將a的左右兩側劃分出來。

bbbbb|a|cccc

問題就轉化成了在a左邊選一個字母,同時在a右邊選一個字母的所有選法。

我們設左邊的字符數量為left,右邊的字符數量為right,那么根據排列組合的知識可以得到子串數量為:

(left + 1) * (right + 1)

注意這里要加一因為a也要算進去。

以上就是貢獻法的大致思路,所謂橫看成嶺側成峰,就是從結果出發,逆推出有效的結論

可能有的小伙伴發現了我們這個題目有一個要求,即——僅包含一個字符a

那我們就來想一下,如果沒有這個條件,貢獻法可不可行呢?

答案是否定的,我們來觀察下面的序列

bbbbabbabbb

可以明顯的發現最長的串是同時包含兩個a的,而我們使用貢獻法就需要分別求出包含指定a的所有子串,我們將這些子串視為一個集合

在計算完所有包含指定的a的所有子串后我們要進行集合合并,而根據容斥原理,集合合并時需要減去兩個集合的交集,顯然這個交集我們是不好求出來的。

造成這種情況的原因就是兩個集合不是互斥的,放在概率論中就可以說兩個條件不是獨立的

所以在判斷能否使用貢獻法之前需要先判斷一下給定的條件能否使每個元素的貢獻皆相互獨立

反之,如果發現條件能夠使整個結果的集合劃分為幾個部分,那么就可以使用貢獻法。(反應在題目中一般就是“唯一”,“單個”等詞)

紙上學來終得錢,接下來我們就根據具體的題目分析,一起來看看所謂的“貢獻法”到底有何魔力。


孤獨的照片


分析

暴力枚舉所有區間的話時間復雜度是O(n^2),顯然行不通,但是我們發現所有的孤獨的照片都有一個特點,即——同時包含兩種牛,并且其中有一種牛的數量為1

很敏銳的發現題目中有唯一的條件,那么可不可以用我們上面講的貢獻法來寫呢?

使用貢獻法需要滿足一個條件,即——我們選定的貢獻的對象可以將要求的集合劃分

很顯然是可以的,因為兩頭可能孤獨的牛不會出現在同一張“孤獨的照片”內所以任意兩頭牛產生的貢獻的交集為空集,所以我們可以使用貢獻法。

那么接下來我們就來思考一下如何使用貢獻法。

根據上面的思路,我們需要通過排列組合來每頭牛的貢獻就要保證當前區間只有一頭此類牛。

這個簡單,我們預處理出每頭牛左邊和右邊的同類牛的位置(使用掃描法),就可以計算出對于每頭牛的最長的“孤獨的照片”,隨后進行排列組合就好了。

這道題排列組合有一個小技巧,因為有一個要求最短區間長度為3,所以我們需要分類討論該位置在區間兩邊和在區間中間的情況。


代碼

/*貢獻法
*/
#include<iostream>
#include<cstring>
using namespace std;
typedef long long LL;
const int N = 500010;
char s[N];
int n;
int l[N], r[N];
LL ans;LL find(char x)
{int m = 0;memset(l, 0, sizeof(l)); memset(r, 0, sizeof(r));for(int i = 1; i <= n; i++)if(s[i] == x)l[i] = m, m = i;m = n + 1;for(int i = n; i >= 1; i--)if(s[i] == x)r[i] = m, m = i;// 預處理LL ls = 0;for(int i = 1; i <= n; i++){if(s[i] == x) //匹配了{int left = i - l[i] - 1, right = r[i] - i - 1; //左右長度//printf("%d %d %d ", i, left, right);ls += max((LL)0, (LL)left * right);ls += max(0, left - 1);ls += max(0, right - 1);}}return ls;
}int main()
{scanf("%d%s", &n, s + 1);ans += find('G');ans += find('H');printf("%lld", ans);return 0;
}

子串分值


分析

可以發現題目中有唯一的要求,所以我們考慮使用貢獻法

那么,接下來我們要如何來劃分呢?

這個簡單,我們通過26個英文字母來劃分,因為f函數是求貢獻和,所以我們每次只求單個字符的貢獻,最后加起來就一定是貢獻和。

但是如果這道題是要我們判斷區間內存在個數為1的字符的區間的數量,顯然就無法直接用貢獻法求解了,需要進一步的分析。


代碼

// 貢獻法,枚舉26個字母,貢獻求和
#include<iostream>
using namespace std;
typedef long long LL;
const int N = 100010;
char s[N];
int n, l[N], r[N];
LL idx;
LL find(char x)
{int m = 0; LL idx = 0;for(int i = 1; i <= n; i++)if(s[i] == x)l[i] = m, m = i;m = n + 1;for(int i = n; i >= 1; i--)if(s[i] == x)r[i] = m, m = i;for(int i = 1; i <= n; i++){if(s[i] == x){int left = i - l[i] - 1, right = r[i] - i - 1;idx += ((LL)left + 1) * (right + 1);}}return idx;
}int main()
{scanf("%s", s + 1);for(int i = 1; s[i]; n = i++);for(char x = 'a'; x <= 'z'; x++)idx += find(x);printf("%lld", idx);return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/899008.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/899008.shtml
英文地址,請注明出處:http://en.pswp.cn/news/899008.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

go test相關命令

在 Go 項目中&#xff0c;go test 可以用于運行整個工程中的測試文件。以下是幾種方式&#xff1a; 1. 運行當前模塊或整個工程的測試 go test ./..../... 表示遞歸測試所有子目錄中的測試文件&#xff08;*_test.go&#xff09;。適用于 Go Modules 或 GOPATH 結構的項目。 …

RocketMQ 詳細知識點總結

RocketMQ 詳細知識點總結 1. 核心概念 1.1 基礎組件 Producer(生產者) 消息的發送者支持同步、異步和單向發送方式提供事務消息功能Consumer(消費者) 消息的接收者支持Push和Pull兩種消費模式支持集群消費和廣播消費NameServer(命名服務) 路由注冊中心無狀態節點,可集…

文字也能生成視頻?【藍耘實踐】:通義萬相2.1文生視頻

文字也能生成視頻&#xff1f;【藍耘實踐】&#xff1a;通義萬相2.1文生視頻 上次我們已經介紹了關于在藍耘云平臺實踐通義萬相的基本玩法&#xff0c;這次將介紹進階玩法&#xff0c;也就是使用文字來生成視頻。 首先我們還是先注冊或者登錄藍耘云平臺。 通過藍耘平臺進入流…

藍橋杯 跑步計劃

問題描述 小藍計劃在某天的日期中出現 1 時跑 5 千米&#xff0c;否則只跑 1 千米。注意&#xff1a;日期中出現 1 不僅指年月日&#xff0c;也指星期。 請問按照小藍的計劃&#xff0c;2023 年小藍總共會跑步鍛煉多少千米&#xff1f; 例如&#xff1a; 5 月 1 日1 月 13 …

K8S集群新增和刪除Node節點(K8s Cluster Adds and Removes Node Nodes)

實戰&#xff1a;在已有K8S集群如何新增和刪除Node節點 在Kubernetes (K8S) 集群中&#xff0c;Node節點是集群中的工作節點&#xff0c;它們運行著容器的實際實例。管理K8S集群中的Node節點&#xff0c;包括新增和刪除節點&#xff0c;是一個常見且重要的操作&#xff0c;可以…

ASP.NET Web的 Razor Pages應用,配置熱重載,解決.NET Core MVC 頁面在更改后不刷新

Razor Pages應用&#xff0c;修改頁面查看修改效果&#xff0c;如果沒有熱重載&#xff0c;改一句話跑一次&#xff0c;這個活就沒法干了。 1、VS2022中的NuGet中安裝RuntimeCompilation Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation 需要配套你的.net sdk版本&#x…

死亡并不是走出生命 而是走出時間

目錄 第一章 倒春寒 第二章 悖論與共生 第三章 坍縮與永恒 第四章 在時差里相愛 終章 你從未離開 第一章 倒春寒 2022年春天的揚州東關街&#xff0c;青衣在文昌閣古槐下調試著「時間膠囊」算法。這個能將人類記憶轉化為數據流的程序&#xff0c;是他用三年時間對抗漸凍…

網絡安全基礎:五類安全服務、八種安全機制與OSI七層模型的全面解析

目錄 引言 五類安全服務 2.1 認證服務 2.2 訪問控制 2.3 數據保密性 2.4 數據完整性 2.5 不可否認性 八種安全機制 3.1 加密機制 3.2 數字簽名 3.3 訪問控制機制 3.4 數據完整性機制 3.5 認證交換機制 3.6 流量填充機制 3.7 路由控制機制 3.8 公證機制 OSI七層…

PhotoShop學習02

1.添加文本 這個工具欄是文字工具欄&#xff0c;快捷鍵是T。選擇之后鼠標會變成一個豎杠外貌&#xff0c;我們可以借此在圖片中寫入文字。 選擇后&#xff0c;上方的工具欄會變為專門調整文字工具 這個框點擊旁邊的小箭頭可以選擇我們我們電腦系統自帶的字體&#xff0c;同時可…

黃土高原風蝕區解析多源數據融合與機器學習增強路徑-RWEQ+集成技術在風蝕模數估算中的全流程增強策略—從數據融合到模型耦合的精細化操作指南

土壤風蝕模數估算長期面臨?模型參數不確定性高?、?空間異質性表達不足?兩大技術瓶頸。RWEQ集成技術框架?&#xff0c;通過耦合地理時空分析、機器學習算法與物理過程模型&#xff0c;實現風蝕模數估算精度的系統性提升。以黃土高原典型風蝕區&#xff08;38N-40N&#xff…

BFS解決FloodFill算法

1.圖像渲染 733. 圖像渲染 - 力扣&#xff08;LeetCode&#xff09; 1.題目解析 有一幅以 m x n 的二維整數數組表示的圖畫 image &#xff0c;其中 image[i][j] 表示該圖畫的像素值大小。你也被給予三個整數 sr , sc 和 color 。你應該從像素 image[sr][sc] 開始對圖像進行…

LeetCode(977):有序數組的平方

有序數組的平方 題目鏈接 題目&#xff1a;給你一個按非遞減順序排序的整數數組 nums&#xff0c;返回每個數字的平方組成的新數組&#xff0c;要求也按非遞減順序排序。 //暴力 #include<stdio.h> void sort(int *nums,int n){for(int i0;i<n;i)for(int ji1;j<…

OpenAI的“噩夢”,DeepSeek V3-0324效率革命展現中國AI雄心

3月24日晚&#xff0c;DeepSeek低調發布其V3模型的小版本更新——DeepSeek V3-0324&#xff0c;這一操作立即在社區引發熱議。據悉&#xff0c;該版本已集成至DeepSeek官網、應用程序和小程序&#xff0c;用戶只需關閉“Deep Thinking”功能即可體驗。另該模型已在Hugging Face…

mysql創建庫表插入數據演示

show databases; use zzj; create table stu (sid int primary key,name varchar(10) not null,sex varchar(2) );desc stu;insert into stu (sid, name, sex) values (1, zzj, 男);select * from stu; desc stu: select * from stu:

C語言 - 整數與浮點數運算的類型轉換規則

C 語言整數與浮點數運算的類型轉換規則 在 C 語言中&#xff0c;不同數據類型在運算時會進行 隱式類型轉換。當 有符號整數&#xff08;int&#xff09;、無符號整數&#xff08;unsigned int&#xff09; 和 浮點型&#xff08;float、double&#xff09; 進行運算時&#xf…

用SVG繞過瀏覽器XSS審計

[Translated From]&#xff1a;http://insert-script.blogspot.com/2014/02/svg-fun-time-firefox-svg-vector.html SVG - <use> element SVG中的<use>元素用于重用其他元素&#xff0c;主要用于聯接<defs>和alike&#xff0c;而我們卻用它來引用外部SVG文件…

【構建CV圖像識別系統】從傳統方法到深度學習

目錄 1. 圖像的基本概念1.1 像素與色彩1.2 過濾與卷積 2. 圖像分類與檢測3. 圖像特征的提取3.1 全局特征3.2 局部特征3.2.1 邊緣&#xff08;Edge&#xff09;3.2.2 角點&#xff08;Corner&#xff09;3.2.3 SIFT 特征 4. 傳統方法與深度學習在圖像識別中的應用4.1 基于傳統方…

Kubernetes高級應用之-重啟策略

一、介紹&#xff0b;擴展應用&#xff08;涉及的高級資源在后續會寫出來&#xff09; # Kubernetes Pod重啟策略&#xff08;RestartPolicy&#xff09;全面解析 ## 一、重啟策略的核心價值與重要性 在Kubernetes集群中&#xff0c;Pod重啟策略&#xff08;RestartPolicy&a…

簡記_單片機硬件最小系統設計

以STM32為例&#xff1a; 一、電源 1.1、數字電源 IO電源&#xff1a;VDD、VSS&#xff1a;1.8~3.6V&#xff0c;常用3.3V&#xff0c;去耦電容1 x 10u N x 100n &#xff1b; 內核電源&#xff1a;內嵌的穩壓器輸出&#xff1a;1.2V&#xff0c;給內核、存儲器、數字外設…

matlab使用fmincon開加速

在使用 fmincon 進行優化時&#xff0c;可以通過以下方法加速優化過程。這些方法主要涉及算法選擇、并行計算、減少函數調用次數等。以下是具體建議和實現方式&#xff1a; 1. 選擇合適的優化算法 fmincon 支持多種優化算法&#xff0c;不同的算法適用于不同類型的優化問題。選…