QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#123060 | #5551. Selling RNA Strands | lmeowdn | 0 | 20ms | 159352kb | C++14 | 3.5kb | 2023-07-11 17:44:45 | 2023-07-11 17:44:46 |
Judging History
answer
#include<bits/stdc++.h>
#define fi first
#define se second
#define eb emplace_back
#define mp make_pair
using namespace std;
typedef long double ld;
typedef long long ll;
typedef unsigned long long ull;
typedef __int128 i128;
template<typename T,typename U>
T ceil(T x, U y) {return (x>0?(x+y-1)/y:x/y);}
template<typename T,typename U>
T floor(T x, U y) {return (x>0?x/y:(x-y+1)/y);}
template<class T,class S>
bool chmax(T &a,const S b) {return (a<b?a=b,1:0);}
template<class T,class S>
bool chmin(T &a,const S b) {return (a>b?a=b,1:0);}
int popcnt(int x) {return __builtin_popcount(x);}
int popcnt(ll x) {return __builtin_popcountll(x);}
int topbit(int x) {return (x==0?-1:31-__builtin_clz(x));}
int topbit(ll x) {return (x==0?-1:63-__builtin_clzll(x));}
int lowbit(int x) {return (x==0?-1:__builtin_ctz(x));}
int lowbit(ll x) {return (x==0?-1:__builtin_ctzll(x));}
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
typedef pair<int,int> pii;
typedef vector<int> vi;
typedef vector<pii> vp;
typedef tuple<int,int,int> tiii;
int read() {
int x=0,w=1; char c=getchar();
while(!isdigit(c)) {if(c=='-') w=-1; c=getchar();}
while(isdigit(c)) {x=x*10+(c-'0'); c=getchar();}
return x*w;
}
const int N=1e5+5,M=2e6+5;
int n,m,p[N],len[N],l[N],r[N],mn[M],mx[M],ch1[M][4],ch2[M][4],tot1=1,tot2=1,cnt,ans[N],rt[M];
vi s[N],g[M],pre[N],suf[N],fin1[M],fin2[M];
int trans(char c) {
if(c=='A') return 0;
if(c=='U') return 1;
if(c=='C') return 2;
if(c=='G') return 3;
assert(0);
}
vi read_string() {
static char tmp[N]; scanf("%s",tmp+1);
int k=strlen(tmp+1);
vi res(k+1);
rep(i,1,k) res[i]=trans(tmp[i]);
return res;
}
namespace SegT {
int ls[N<<5],rs[N<<5],s[N<<5],tot;
int merge(int x,int y) {
if(!x||!y) return x+y; s[x]+=s[y];
ls[x]=merge(ls[x],ls[y]), ls[y]=merge(rs[x],rs[y]);
return x;
}
void add(int &p,int l,int r,int x) {
if(!p) p=++tot; s[p]++;
if(l==r) return; int mid=l+r>>1;
if(x<=mid) add(ls[p],l,mid,x);
else add(rs[p],mid+1,r,x);
}
int qry(int p,int l,int r,int x,int y) {
if(!p||!x) return 0; int mid=l+r>>1;
if(l==x&&r==y) return s[p];
if(y<=mid) return qry(ls[p],l,mid,x,y);
else if(x>mid) return qry(rs[p],mid+1,r,x,y);
else return qry(ls[p],l,mid,x,mid)+qry(rs[p],mid+1,r,mid+1,y);
}
}
void dfs1(int u) {
mn[u]=cnt+1;
for(int x:fin1[u]) p[x]=++cnt;
mx[u]=cnt;
rep(i,0,3) {
int v=ch1[u][i]; if(!v) continue;
dfs1(v); chmax(mx[u],mx[v]);
}
}
void dfs2(int u) {
rep(i,0,3) {
int v=ch2[u][i]; if(!v) continue;
dfs2(v); rt[u]=SegT::merge(rt[u],rt[v]);
}
for(int x:fin2[u]) SegT::add(rt[u],1,n,p[x]);
for(int x:g[u]) ans[x]=SegT::qry(rt[u],1,n,l[x],r[x]);
}
signed main() {
n=read(), m=read();
rep(i,1,n) {
s[i]=read_string(), len[i]=s[i].size()-1;
int u=1;
rep(j,1,len[i]) {
if(!ch1[u][s[i][j]]) ch1[u][s[i][j]]=++tot1;
u=ch1[u][s[i][j]];
} fin1[u].eb(i);
u=1;
per(j,len[i],1) {
if(!ch2[u][s[i][j]]) ch2[u][s[i][j]]=++tot2;
u=ch2[u][s[i][j]];
} fin2[u].eb(i);
}
dfs1(1);
rep(i,1,m) {
pre[i]=read_string(), suf[i]=read_string();
int u=1,lenp=pre[i].size()-1,lens=suf[i].size()-1;
rep(j,1,lenp) u=ch1[u][pre[i][j]];
if(u) {
l[i]=mn[u], r[i]=mx[u];
u=1;
per(j,lens,1) u=ch2[u][suf[i][j]];
if(u) g[u].eb(i);
}
}
dfs2(1);
rep(i,1,m) printf("%d\n",ans[i]);
return 0;
}
详细
Subtask #1:
score: 0
Wrong Answer
Test #1:
score: 0
Wrong Answer
time: 20ms
memory: 159352kb
input:
100 100 A G AGC AUA C CCA CGGAG CCGAG GACA UCAAC CUUAU AC A CGUA UAUG UGCGA GCU GUUAU UAAU A UAA U CGCCC GCG U AUUC GACA CC AG GUCGU UUCA AGGC G CU UG CUUA CUAU AA A GUUG GGU UU C GCUG C GUGGA C UAU UAG GC GUU GC UCUCA U AA AG C GGU GC CCUG CCUU GG CAGCU UAGGU GGCUC CUACG UGC UU UAAUG UGGCA CAA UGAG...
output:
6 0 8 0 0 0 4 0 8 3 0 2 1 1 0 0 0 8 9 1 3 1 1 0 1 8 1 12 1 1 3 0 8 0 8 8 1 2 0 1 1 9 1 1 1 0 0 1 1 12 9 0 0 1 0 0 1 4 1 2 1 0 6 6 12 2 1 2 6 2 0 9 2 2 1 6 1 1 0 1 1 0 1 6 1 1 8 8 0 1 1 1 2 12 1 2 1 12 0 1
result:
wrong answer 1st lines differ - expected: '9', found: '6'
Subtask #2:
score: 0
Skipped
Dependency #1:
0%
Subtask #3:
score: 0
Skipped
Dependency #1:
0%
Subtask #4:
score: 0
Skipped
Dependency #1:
0%