이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
typedef pair <int,int> pii;
int n,m;
struct trie{
int cv(char x){
if (x == 'A')return 0;
if (x == 'G')return 1;
if (x == 'C')return 2;
return 3;
}
struct node{
node* c[4];
int in,out;
};
node* new_node(){
node* res = new node;
for (int i = 0;i < 4;i ++)res -> c[i] = nullptr;
res -> in = 0;
res -> out = 0;
return res;
}
node* root = new_node();
void ins(string s){
node* cur = root;
for (int i = 0;i < s.size();i ++){
if (cur -> c[cv(s[i])] == nullptr){
cur -> c[cv(s[i])] = new_node();
}
cur = cur -> c[cv(s[i])];
}
}
pii ask(string s){
node* cur = root;
for (int i = 0;i < s.size();i ++){
if (cur -> c[cv(s[i])] == nullptr){
return {-1,-1};
}
cur = cur -> c[cv(s[i])];
}
return {cur->in,cur->out};
}
int timeDFS = 0;
void dfs(node* cur){
cur -> in = ++timeDFS;
for (int i = 0;i < 4;i++){
if (cur -> c[i] != nullptr)dfs(cur->c[i]);
}
cur -> out = timeDFS;
}
};
trie a,rev_a;
string s[100100];
string rev_s[100100];
string p[100100],q[100100];
const int MAXSZ = 2e6;
vector <int> g[2000100];
struct query{
int l,r,id;
};
vector <query> all[2000100];
int BIT[MAXSZ + 100];
int ans[100100];
void upd(int x){
for (;x <= MAXSZ;x += x & -x){
BIT[x]++;
}
}
int get(int x){
int res = 0;
for (;x>0;x-=x&-x){
res += BIT[x];
}
return res;
}
int ask(int l,int r){
return get(r) - get(l-1);
}
int main(){
ios_base::sync_with_stdio(0);cin.tie(nullptr);cout.tie(nullptr);
cin>>n>>m;
for (int i = 1;i <= n;i ++){
cin>>s[i];
a.ins(s[i]);
rev_s[i] = s[i];
reverse(rev_s[i].begin(),rev_s[i].end());
rev_a.ins(rev_s[i]);
}
a.dfs(a.root);
rev_a.dfs(rev_a.root);
for (int i = 1;i <= n;i ++){
//cout<<a.ask(s[i]).fi<<' '<<rev_a.ask(rev_s[i]).fi<<'\n';
g[a.ask(s[i]).fi].push_back(rev_a.ask(rev_s[i]).fi);
}
for (int i = 1;i <= m;i ++){
cin>>p[i]>>q[i];
pii x = a.ask(p[i]);
reverse(q[i].begin(),q[i].end());
pii y = rev_a.ask(q[i]);
//cout<<x.fi<<' '<<x.se<<' '<<y.fi<<' '<<y.se<<'\n';
if (x.fi != -1 && y.fi != -1){
all[x.second].push_back({y.first,y.second,i});
all[x.first - 1].push_back({y.first,y.second,-i});
}
}
for (int i = 1;i <= MAXSZ;i ++){
for (auto x:g[i]){
upd(x);
}
for (auto x:all[i]){
if (x.id < 0){
ans[-x.id] -= ask(x.l,x.r);
}
else{
ans[x.id] += ask(x.l,x.r);
}
}
}
for (int i = 1;i <= m;i ++){
cout<<ans[i]<<'\n';
}
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
selling_rna.cpp: In member function 'void trie::ins(std::string)':
selling_rna.cpp:29:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
29 | for (int i = 0;i < s.size();i ++){
| ~~^~~~~~~~~~
selling_rna.cpp: In member function 'pii trie::ask(std::string)':
selling_rna.cpp:38:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
38 | for (int i = 0;i < s.size();i ++){
| ~~^~~~~~~~~~| # | 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... |