QOJ.ac
QOJ
The 2nd Universal Cup Finals is coming! Check out our event page, schedule, and competition rules!
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#556832 | #6816. Invincible Hotwheels | ZepX_D | WA | 3ms | 71636kb | C++14 | 2.6kb | 2024-09-10 21:19:27 | 2024-09-10 21:19:27 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
int n,fi[2010000],L[2010000];
char c[2010000];
int ch[2001000][26],cn=1,id[2001000],fail[2010000],po[2010000][2],is[2010000];
vector<int>g[2010000];
int dfn[2010000],sz[2010000];
void dfs(int x){
dfn[x]=++dfn[0],sz[x]=1;
for(int v:g[x])dfs(v),sz[x]+=sz[v];
}
#define pb push_back
void build(){
queue<int>q;
for(int i=0;i<26;i++)
if(ch[0][i])q.push(ch[0][i]);
while(!q.empty()){
int u=q.front(),f=fail[u];q.pop();
if(id[u])po[u][0]=u,po[u][1]=po[f][0];
else po[u][0]=po[f][0],po[u][1]=po[f][1];
for(int i=0;i<26;i++){
if(!ch[u][i])ch[u][i]=ch[f][i];
else fail[ch[u][i]]=ch[f][i],q.push(ch[u][i]);
}
}
for(int i=1;i<=cn;i++)g[fail[i]].pb(i);
dfs(0);
}
struct T1{
int tr[2010000];
inline void ad(int x,int z){for(;x<=cn;x+=(x&-x))tr[x]+=z;}
inline int ask(int x){
int s=0;
for(;x;x-=(x&-x))s+=tr[x];
return s;
}
}T;
int cc(int a,int b){
if(a==-1||b==-1)return -1;
if(!a||!b)return a+b;
if(a==b)return a;
return -1;
}
struct T2{
int tr[2010000];int O;
inline void inn(int N){O=N;for(int i=1;i<=N;i++)tr[i]=0;}
inline void ad(int x,int z){for(;x<=O;x+=(x&-x))tr[x]=cc(tr[x],z);}
inline int ask(int x){
int s=0;
for(;x;x-=(x&-x))s=cc(s,tr[x]);return s;
}
}B;
bool qc[2010000];int xp[2010000];
struct ed{int l,r,c;}a[2010000];
int main(){
scanf("%d",&n);
for(int i=1,e=0;i<=n;i++){
fi[i]=e;
scanf("%s",c+1+e);
L[i]=strlen(c+1+e);
int u=0;
for(int j=e+1;j<=e+L[i];j++){
int p=c[j]-'a';
if(!ch[u][p])ch[u][p]=++cn;
u=ch[u][p];
}
id[u]=i,e+=L[i],is[i]=u;
}
build();
int ans=0;
for(int i=1;i<=n;i++){
vector<int>J;
int m=0;
for(int j=1,u=1;j<=L[i];j++){
u=ch[u][c[j+fi[i]]-'a'];
if(j==L[i])u=fail[u];
if(po[u][1])T.ad(dfn[fail[po[u][1]]],1);//注意后面清了
cout << po[u][0] << " " << po[u][1] << '\n';
for(int o=0;o<2;o++)
if(po[u][o]){
int t=id[po[u][o]];
if(t!=i){
if(!qc[t])J.pb(t),qc[t]=1,xp[t]=0;
a[++m]=(ed){j-L[t]+1,j,t};
}
}
}
sort(a+1,a+m+1,[&](ed x,ed y){if(x.r!=y.r)return x.r>y.r;return x.l<y.l;});
B.inn(L[i]);
for(int j=1;j<=m;j++){
xp[a[j].c]=cc(xp[a[j].c],B.ask(a[j].l));
B.ad(a[j].l,a[j].c);
}
for(int x:J){
qc[x]=0;int u=is[x];
if(T.ask(dfn[u]+sz[u]-1)!=T.ask(dfn[u]-1))continue;//说明被ban了
if(xp[x]==-1||xp[x]==0)continue;
ans++;
}
for(int j=1,u=1;j<=L[i];j++){
u=ch[u][c[j+fi[i]]-'a'];
if(j==L[i])u=fail[u];
if(po[u][1])T.ad(dfn[fail[po[u][1]]],-1);
}
cout << ans << '\n';
}
printf("%d",ans);
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Wrong Answer
time: 3ms
memory: 71636kb
input:
8 wwwsoupunetcom wwwsoupunet soupunet punetcom punet pun net n
output:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 26 32 0 0 23 28 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 26 32 0 0 28 34 3 0 0 0 0 0 0 0 0 0 0 26 32 0 0 34 0 3 0 0 0 0 32 0 0 0 34 0 0 0 0 0 0 0 4 0 0 0 0 32 0 0 0 0 0 4 0 0 0 0 0 0 4 0 0 0 0 0 0 4 0 0 4 4
result:
wrong answer 1st numbers differ - expected: '6', found: '0'