乙個只有大寫a、b的序列,求這個序列有多少個子串是delicious的。
delicious:對於乙個字串,它是delicious的,當且僅當它的每乙個字元都屬於乙個長度大於1的回文子串。
第一行乙個整數n,代表序列長度
第二行乙個只含ab的字串
滿足題意的子串個數
對於這道題,我一開始是從正面下手,即找滿足條件的子串有哪些規律、特徵,然後來選擇;但情況較為複雜,在要求時間內,並沒有有效完成。後來與別人交流過程中了解到,可以從反面下手,把不滿足條件的減去,會更方便。
對於乙個長度為n的字串,可供我們選擇的子串共有n*(n-1)/2個,這是總數;而不符合條件的子串,有以下四種情況:
aa……b
bb……a
abb……b
baa……a
不難發現,後兩種正是倒序的前兩種的情況,因此我們只需從正序和倒序,找到ab相異的情況,然後從總數中減去該子串的長度,最後,由於正序和倒序過程中,會將ab、ba減去兩次,因此我們只需在第一次正序遍歷過程中,記下ab、ba的個數,最後在ans中再加上,即可得到最終答案。
這道題還是很注重思考的,一開始貿然的從正面入手,很容易陷入乙個大坑,難以完整解答;當遇到這種情況時,學會從反面入手,想想不滿足題意的情況,當「加法」不適用時,可以考慮「減法」,能夠有效提高做題的效率。#include
#include
using
namespace std;
string s;
long
long n,ans;
intmain()
} flag=s[n-1]
; index=n-1;
for(
long
long i=n-
2;i>=0;
--i)
} ans+
=cnt;
cout
}
程式設計思維與實踐 CSP M3 補題
思路 簽到題,只要遍歷一遍陣列看一下有多少個i與i 1不相等的節點,在該節點數上加一即為答案。思路 該題只要使用兩個指針對矩陣進行兩次遍歷即可,一遍橫向遍歷,一遍縱向遍歷,遍歷過程中若遇到滿足條件的可以消除的位置,則在建立的標記陣列中的對應位置打上1 若直接修改原陣列會出現十字形無法識別的情況 兩邊...
T3提示登陸失敗
問題現象 t3 10.8 plus2 with最新增量補丁包,在win7客戶端,雙擊t3圖示,直接提示 登入失敗 問題解決過程 當時客戶反應三颱電腦,都登入失敗,嘗試過重裝軟體 註冊dll檔案等,甚至在安全模式下,把mdac相關檔案都替換,都無效,依然是登陸失敗。之前都是正常的,三颱電腦突然同時這個...
YCH的模擬賽 T3
暴搜或者字典樹,但是因為輸出所有的方案而不是方案數,不管什麼做法都逃不過輸出,所以都差不多 sol1 記憶化搜尋 當列舉方案時,f i 表示已經把字串的前i個字母都拼好的情況下有多少方案 考慮從第i 1個字元開始到j是乙個給定的單詞 如果有這樣的j的話就可以轉移 然後開乙個vector把每乙個狀態下...