社区讨论
特殊性质 B 5 pts 求条
P14363[CSP-S 2025] 谐音替换参与者 3已保存回复 28
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 28 条
- 当前快照
- 1 份
- 快照标识符
- @mhpi120q
- 此快照首次捕获于
- 2025/11/08 07:40 4 个月前
- 此快照最后确认于
- 2025/11/08 07:52 4 个月前
CPP
// 我就做个特殊性质 B 跑路
// ^_^
#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
#define big long long
using namespace std;
big n,q,ans;
string s1,s2;
struct Node{
big l,r;
friend bool operator < (const Node L,const Node R)
{
if(L.l != R.l) return L.l < R.l;
return L.r < R.r;
}
};
map <big,vector<Node>> mp;
vector <big> appr;
vector <Node> TT;
vector <big> ls;
map <big,vector<big>> cc;
int main()
{
// freopen("replace.in","r",stdin);
// freopen("replace.out","w",stdout);
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> n >> q;
for(big i = 1;i <= n;i++)
{
cin >> s1 >> s2;
big p1 = s1.find("b"), p2 = s2.find("b");
big numl = p1, numr = s1.length()-p1-1;
if(mp.find(p2-p1) == mp.end()) appr.push_back(p2-p1);
mp[p2-p1].push_back({numl,numr});
}
for(auto del: appr) sort(mp[del].begin(),mp[del].end());
while(q--)
{
ans = 0;
cin >> s1 >> s2;
if(s1.length() != s2.length())
{
cout << "0\n";
continue;
}
big p1 = s1.find("b"), p2 = s2.find("b");
big del = p2-p1;
big numl = p1, numr = s1.length()-p1-1;
TT = mp[del];
if(TT.size() == 0)
{
cout << "0\n";
continue;
}
big pp = -1;
ls.clear(); cc.clear();
for(auto tmp: TT)
{
big ll = tmp.l, rr = tmp.r;
if(cc.find(ll) == cc.end()) ls.push_back(ll);
cc[ll].push_back(rr);
}
big l = 0, r = ls.size()-1;
while(l <= r)
{
big mid = (l+r)>>1;
big flag = 0;
flag = (ls[mid] <= numl);
if(flag)
{
pp = mid;
l = mid+1;
}
else r = mid-1;
}
for(big i = 0;i <= pp;i++)
{
big ppp = -1;
l = 0, r = cc[ls[i]].size()-1;
// cout << r+1 << ":::\n";
while(l <= r)
{
big mid = (l+r)>>1;
big flag = 0;
flag = (cc[ls[i]][mid] <= numr);
if(flag)
{
ppp = mid;
l = mid+1;
}
else r = mid-1;
}
ans += (ppp+1);
}
cout << ans << "\n";
}
return 0;
}
回复
共 28 条回复,欢迎继续交流。
正在加载回复...