이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
using namespace std ;
const int MX = 4e6 + 5 ;
vector<int> qc[MX] ;
int num[27] , ans[MX] ;
pair<int,int> Q[MX] ;
struct BIT
{
int N = 0 ;
vector<int> t ;
void init(int n)
{
N = n ;
t = vector<int> (n+2,0) ;
}
void update(int idx , int val)
{
for(int i = idx ; i <= N ; i += (i&(-i)))
{
t[i] += val ;
}
}
int _query(int idx)
{
int ret = 0 ;
for(int i = idx ; i >= 1 ; i -= (i&(-i)))
{
ret += t[i] ;
}
return ret ;
}
int query(int l , int r)
{
return _query(r)-_query(l-1) ;
}
};
struct trie
{
vector<int> vals[MX] ;
int cur = 0 , nex[MX][5] , ed[MX] , tin[MX] , tout[MX] , timer = 0 ;
BIT B ;
void init()
{
for(int i = 0 ; i < MX ; ++i)
{
ed[i] = 0 , tin[i] = 0 , tout[i] = 0 ;
for(int j = 0 ; j < 5 ; ++j)
{
nex[i][j] = 0 ;
}
}
B.init(MX) ;
}
void add_string(int idx , string &s)
{
int siz = s.size() , v = 0 ;
for(int i = 0 ; i < siz ; ++i)
{
int ts = num[s[i]-'A'] ;
if(!nex[v][ts]) nex[v][ts] = ++cur ;
v = nex[v][ts] , vals[v].push_back(idx) ;
}
ed[idx] = v ;
}
int find_string(string &p)
{
int siz = p.size() , v = 0 ;
for(int i = 0 ; i < siz ; ++i)
{
int ts = num[p[i]-'A'] ;
if(!nex[v][ts]) return -1 ;
v = nex[v][ts] ;
}
return v ;
}
void traverse(int s)
{
tin[s] = ++timer ;
for(int i = 0 ; i < 4 ; ++i)
{
if(!nex[s][i]) continue ;
traverse(nex[s][i]) ;
}
tout[s] = ++timer ;
}
void add_num(int idx , int val)
{
B.update(tin[ed[idx]],val) ;
}
int query(int idx)
{
return B.query(tin[idx],tout[idx]) ;
}
};
int main()
{
num['A'-'A'] = 0 , num['G'-'A'] = 1 , num['C'-'A'] = 2 , num['U'-'A'] = 3 ;
int n , m ;
scanf("%d%d",&n,&m) ;
trie pref , suf ;
pref.init() , suf.init() ;
for(int i = 1 ; i <= n ; ++i)
{
string s ;
cin>>s ;
pref.add_string(i,s) ;
reverse(s.begin(),s.end()) ;
suf.add_string(i,s) ;
}
suf.traverse(0) ;
for(int i = 1 ; i <= m ; ++i)
{
string p , q ;
cin>>p>>q ;
reverse(q.begin(),q.end()) ;
int pr = pref.find_string(p) , sf = suf.find_string(q) ;
if(pr<0) continue ;
if(sf<0) continue ;
qc[pr].push_back(i) ;
Q[i] = {pr,sf} ;
}
for(int i = 0 ; i < MX ; ++i)
{
for(int j : pref.vals[i])
{
suf.add_num(j,1) ;
}
for(int j : qc[i])
{
ans[j] += suf.query(Q[j].second) ;
}
for(int j : pref.vals[i])
{
suf.add_num(j,-1) ;
}
}
for(int i = 1 ; i <= m ; ++i)
{
printf("%d\n",ans[i]) ;
}
return 0 ;
}
컴파일 시 표준 에러 (stderr) 메시지
selling_rna.cpp: In function 'int main()':
selling_rna.cpp:106:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
106 | scanf("%d%d",&n,&m) ;
| ~~~~~^~~~~~~~~~~~~~
# | 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... |