3770 瘋狂的限制 亂搞

2021-07-11 04:42:07 字數 1088 閱讀 9612

從左到右列舉子串的右區間,同時維護每個位置作為子串的左區間時能滿足的限制條件個數,將滿足條件個數在[l,r]的左區間統計入答案即可。

設當前列舉的右區間為i,位置x作為左區間時滿足的限制條件個數為a[x]。

現在將右區間改為i+1,如何維護a:

首先a[i+1]可以o(k)判斷。

對於某個限定條件c[x]、l[x]、r[x],其需要修改的a最多2段:

1. 若s[i+1]=c[x],那麼從 倒數第r[x]+2次出現的c[x]的位置+1 到 倒數第r[x]+1次出現的c[x]的位置 的a需要-1。

2. 若s[i+1]=c[x],那麼從 倒數第l[x]+1次出現的c[x]的位置+1 到 倒數第l[x]次出現的c[x]的位置 的a需要+1。

易於發現,對於每個限制條件而言,所需要修改的位置是單調遞增的,所以對乙個限制條件而言,其所需要修改的位置數總和不超過o(|s|),記錄每個字元的出現位置即可做到線性修改。

所以總修改次數為o(k|s|),暴力修改就好了。

居然卡到了bzoj rank1

#include

#include

#include

#include

using

namespace

std;

const

int n=100005;

int cnt1,cnt2,cnt3,cnt4;

int k,l,r,n,base,now;

char s[n];

int c[n],l[505],r[505],sum[26];

long

long ans;

struct node

;vector

a[26];

int main()

); if (!l) ++base;

}for (int i=1;i<=n;i++)

if (sum[s[i]]>j.r)

while (1)

}ans+=now;

}cout

<< ans << endl;

return

0;}

bzoj3770 瘋狂的限制

瘋狂的限制 題目背景 bzoj3770 分析 算是暴力吧 本來是在做 dp來著,然後看到這道題就一起做掉了 做了這道題終於發現,vector 是多麼有用的東西 我們列舉右端點,那麼每次往右移動乙個,相當於加入了乙個字元,假設當前位置為 cur,tot i 表示i cur 所形成的子串滿足了多少條件,...

亂搞 正確姿勢的亂搞 模擬退火

模擬退火大概原理就是將熱力學裡面金屬退火的原理放在了統計學意義中。其在電腦科學中的應用也是很可觀的 處理一些無法用多項式時間複雜度解決的np問題。對於一些最優化問題,往往我們可以轉化為乙個神奇的函式 引數不限 比如像這樣 如果這個函式滿足單峰性,我們往往可以直接套用三分來處理,但是都說了這如果是乙個...

亂搞 Evensgn 的債務

時間限制 1 sec 記憶體限制 128 mb evensgn 有一群好朋友,他們經常互相借錢。假如說有三個好朋友 a,b,c。a 欠 b 20 元,b 欠 c 20 元,總債務規模為 20 20 40 元。evensgn 是個追求簡約 的人,他覺得這樣的債務太繁雜了。他認為,上面的債務可以完全等價...