题目链接
思路
逐个匹配为
O
(
m
n
)
O(mn)
O(mn),会超时。
换个角度,要匹配的只是
t
i
t_i
ti中各个字符的数量。
那么记录s中每个字符出现的所有位置。第i个name的答案就对应使得
t
i
t_i
ti字符集中的所有字符数量都满足时的
s
[
j
]
s[j]
s[j]下标。
max
c
∈
C
t
i
(
i
d
x
[
c
]
[
n
c
]
)
\max_{c\in C_{t_i}}(idx[c][n_{c}])
c∈Ctimax(idx[c][nc])
C
t
i
C_{t_i}
Cti表示字符串
t
i
t_i
ti的字符集,
n
c
n_c
nc表示字符串
t
i
t_i
ti含字符
c
c
c 的数量。
i
d
x
[
c
]
[
n
c
]
idx[c][n_c]
idx[c][nc]表示在s中,第
n
c
n_c
nc个字符
c
c
c出现的位置。
代码
#include<bits/stdc++.h>
using namespace std;
string s;
map<char, vector<int>> mp;
int main() {
int n;
cin >> n >> s;
for (int i = 0; i < n; ++i)
mp[s[i]].push_back(i);
int m;
cin >> m;
for (int i = 0; i < m; ++i) {
string str;
cin >> str;
map<char, int> p;
for (auto &c: str)
p[c]++;
int ans = 0;
for (auto &entry: p)
ans = max(ans, mp[entry.first][entry.second - 1]);
printf("%d\n", ans + 1);
}
}