错题-巨石迷阵
巨石迷陣
問(wèn)題描述
聽說(shuō)這片土地埋藏著什么秘密,來(lái)到這片土地的人不計(jì)其數(shù),有人說(shuō)這里財(cái)寶無(wú)數(shù),也有人說(shuō)這里是上古文明留下來(lái)的遺跡。小 L 收集情報(bào)和資料很久了,只身一人歷經(jīng)千辛萬(wàn)苦終于來(lái)到了這片地域的中心地帶。突然,四周升起許多巨石,不出所料,面前的正是巨石迷陣。
你面前有 n 塊巨石排成一行,每個(gè)上面有一個(gè)大寫字母。
接下來(lái)有 m 個(gè)詢問(wèn),每一個(gè)詢問(wèn)包含兩個(gè)數(shù)字 l,r ,對(duì)于每個(gè)詢問(wèn),你需要回答這個(gè)處于區(qū)間 [l,r] 的石塊上的字母是否每一個(gè)英文字母都至少出現(xiàn)了一次。
輸入格式
第一行一個(gè)整數(shù) n , n≤5×105
第二行,一個(gè)長(zhǎng)度為 n 的字符串
第三行,一個(gè)整數(shù) m, m≤5×105
接下來(lái)的 m 行,每行兩個(gè)整數(shù)表示 l,r,1≤l≤r≤n
輸出格式
輸出包含 m 行,每行一個(gè) YES ,或者 NO 。
分別表示是否每個(gè)字母都至少出現(xiàn)一次。
樣例輸入
30 AAABCDEFGHIJKLMNOPQRSTUVWXYZAA 5 1 26 2 27 3 28 4 29 5 30樣例輸出
NO NO YES YES NO題解
使用前綴和
以每一個(gè)字母出現(xiàn)的次數(shù)作為前綴和計(jì)算。在給出區(qū)間 l, r 后,就可以使用前綴和計(jì)算這個(gè)區(qū)間中每一個(gè)字母是否出現(xiàn)過(guò)至少一次。
例如:在字符串中下標(biāo)為 i 的字母是 26 個(gè)子母中第 j 個(gè)字母,就把 str[i][j] 置為 1。
#include <bits/stdc++.h> using namespace std; typedef long long ll; ll str[500005][30] = {0}; int main() {ll n;cin >> n;string s;cin >> s;for (ll i = 0; i < n; i++)//在在字符串中下標(biāo)為 i 的字母是 26 個(gè)字母中第 j 個(gè)字母,就把 str[i][j] 加上 1,這里為了后面的計(jì)算前綴和方便下標(biāo)都是從1開始的str[i + 1][s[i] - 'A' + 1]++;for (ll i = 1; i <= 26; i++)//以每一個(gè)字母為單位計(jì)算出現(xiàn)次數(shù)前綴和for (ll j = 1; j <= n; j++)str[j][i] += str[j - 1][i];ll m;cin >> m;for (ll i = 0; i < m; i++){ll l, r;cin >> l >> r;bool check = true;for (ll j = 1; j <= 26; j++){if (str[r][j] - str[l - 1][j] == 0)//當(dāng)出現(xiàn)這個(gè)字母在[l, r]范圍中都沒有出現(xiàn)過(guò)就判斷為NO并且可以直接退出循環(huán){check = false;break;}}if (check)cout << "YES" << endl;elsecout << "NO" << endl;}return 0; }總結(jié)
- 上一篇: Soft-Clipping Mish激活
- 下一篇: 舌尖上的家乡——广东云浮/罗定