이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
string s[100005], t[100005], al[100005], ar[100005], bl[100005], br[100005];
map<string, int> amp, bmp;
pair<int, int> x[100005];
int y[405][305];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n, m, acnt=0, bcnt=0, num=3;
cin >> n >> m;
for (int i=0; i<n; i++)
{
cin >> s[i];
t[i]=s[i];
reverse(t[i].begin(), t[i].end());
amp[s[i]]=bmp[t[i]]=1;
}
for (int i=0; i<m; i++)
{
cin >> al[i] >> bl[i];
reverse(bl[i].begin(), bl[i].end());
ar[i]=al[i];
br[i]=bl[i];
ar[i].back()++;
br[i].back()++;
amp[al[i]]=amp[ar[i]]=bmp[bl[i]]=bmp[br[i]]=1;
}
for (auto it=amp.begin(); it!=amp.end(); it++)
(*it).second=(++acnt);
for (auto it=bmp.begin(); it!=bmp.end(); it++)
(*it).second=(++bcnt);
for (int i=0; i<n; i++)
x[i]={amp[s[i]], bmp[t[i]]};
sort(x, x+n);
for (int i=0; i<=(n-1)/num; i++)
{
int l=i*num, r=min((i+1)*num-1, n-1);
for (int j=l; j<=r; j++)
y[i][j-l]=x[j].second;
sort(y[i], y[i]+r-l+1);
}
for (int i=0; i<m; i++)
{
int AL=lower_bound(x, x+n, make_pair(amp[al[i]], 0))-x;
int AR=lower_bound(x, x+n, make_pair(amp[ar[i]], 0))-x-1;
int BL=bmp[bl[i]], BR=bmp[br[i]]-1, indl=AL/num, indr=AR/num, ans=0;
if (indl==indr)
{
for (int j=AL; j<=AR; j++)
if (x[j].second>=BL && x[j].second<=BR)
ans++;
}
else if (indl<indr)
{
for (int j=indl+1; j<indr; j++)
ans+=upper_bound(y[j], y[j]+num, BR)-lower_bound(y[j], y[j]+num, BL);
for (int j=AL; j<(indl+1)*num; j++)
if (x[j].second>=BL && x[j].second<=BR)
ans++;
for (int j=indr*num; j<=AR; j++)
if (x[j].second>=BL && x[j].second<=BR)
ans++;
}
cout << ans << '\n';
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |