QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#556832#6816. Invincible HotwheelsZepX_DWA 3ms71636kbC++142.6kb2024-09-10 21:19:272024-09-10 21:19:27

Judging History

This is the latest submission verdict.

  • [2024-09-10 21:19:27]
  • Judged
  • Verdict: WA
  • Time: 3ms
  • Memory: 71636kb
  • [2024-09-10 21:19:27]
  • Submitted

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'