Wannafly挑戰賽19 F K串 莫隊

2021-08-29 07:24:09 字數 1361 閱讀 1409

zzt 得到了乙個字串 s 以及乙個整數 k。

wzh 在 1995 年提出了「優雅 k 串」的定義:這個字串每一種字元的個數都是 k 的倍數。

現在 zzt 想要對字串進行 q 次詢問,第 i 次詢問給出乙個區間 [li, ri],他想計算 [li, ri] 中有多少個子串是「優雅 k 串」。

由於 zzt 忙於工作,所以他把這個問題交給了你,請你幫忙解決。

第一行輸入乙個正整數 k。

第二行輸入乙個字串 s。

第三行輸入乙個正整數 q,表示有 q 次詢問。

接下來 q 行,每行輸入兩個正整數 li 和 ri,表示第 i 次詢問。

1 ≤ k ≤ 50.

1≤ | s | ≤ 3 x 104 且 s 僅包含小寫英文本母.

1≤ q ≤ 3 x 104.

1 ≤ xi ≤ yi ≤ n.

每次詢問,輸出乙個正整數,表示滿足條件的「優雅 k 串」的數量。
莫隊即可。

#include #ifdef local

#define debug(x) cout<<#x<<" = "<<(x)const int mod = 1e9 + 7;

const double pi = acos (-1.);

const double eps = 1e-10;

const int inf = 0x3f3f3f3f;

const ll infll = 0x3f3f3f3f3f3f3f3f;

const int maxn = 5e5 + 5;

int k, q, n;

char s[maxn];

int block;

ull val[maxn];

int pre[maxn][26];

unordered_map vis;

struct query

} qr[maxn];

ll res[maxn];

int main()

}block = sqrt (n + 0.5);

sort (qr + 1, qr + 1 + q);

int l = 1, r = 0;

ll ans = 0;

for (int i = 1; i <= q; i++)

while (r > qr[i].r)

while (l < qr[i].l)

while (l > qr[i].l)

res[qr[i].id] = ans;

}for (int i = 1; i <= q; i++) printf ("%lld\n", res[i]);

return 0;

}

Wannafly 挑戰賽 19 參考題解

這一次的 wannafly 挑戰賽題目是我出的,除了第一題,剩餘的題目好像對大部分演算法競賽者來說好像都不是特別友好,但是個人感覺題目質量還是過得去的,下面是題目鏈結以及題解。題目鏈結 wannafly 挑戰賽 19 參考題解 problem a.佇列 q 將操作離線倒序處理,可以線性效率解決這個問...

Wannafly挑戰賽 19 A 佇列Q 思維

這道題剛開始我的想法是用兩個棧分別去存first和last所操作的數,用map標記入棧的數,然後先將first棧中的數輸出,然後再遍歷陣列輸出沒有被標記的數,最後再輸出last棧中的數,雖然我覺得沒什麼問題吧,但是只過了5 的樣例。能ac的方法就是首先我們要從100000開始輸入資料 至於為什麼等會...

牛客 wannafly挑戰賽19 A 佇列

zzt 創造了乙個佇列 q。這個佇列包含了 n 個元素,佇列中的第 i 個元素用 qi 表示。q1 表示隊頭元素,qn 表示隊尾元素。佇列中的元素是 n 的乙個全排列。zzt 需要在這個佇列上執行 p 次操作,操作分兩種 first x 將元素 x 移到隊頭。last x 將元素 x 移到隊尾。在 ...