提交记录 4279


用户 题目 状态 得分 用时 内存 语言 代码长度
superguymj noi18c. 【NOI2018】你的名字 Wrong Answer 96 1.989 s 348016 KB C++ 2.97 KB
提交时间 评测时间
2018-07-19 16:44:12 2020-07-31 22:50:22
#include<algorithm>
#include<cstring>
#include<cctype>
#include<cstdio>
#define rep(i,x,y) for(int i=x; i<=y; ++i)
#define repd(i,x,y) for(int i=x; i>=y; --i)
#define mid (l+r>>1)

using namespace std;
const int N=500005;
typedef long long LL;
int n,m,q,seg_tot,T[N*45],ls[N*45],rs[N*45],cnt,h[N<<1];
char s[N],t[N];
int dfn[N<<1],pos[N<<1],siz[N<<1],ql,qr,root[N<<1],mx[N];
LL ans;
struct edge{int v,n;} e[N<<1];

void ins(int l,int r,int lst,int &rt,int x)
{
	if(!rt) rt=++seg_tot;
	if(l==r)
	{
		T[rt]=T[lst]+1;
		return;
	}
	if(x<=mid) ins(l,mid,ls[lst],ls[rt],x),rs[rt]=rs[lst];
	else ins(mid+1,r,rs[lst],rs[rt],x),ls[rt]=ls[lst];
	T[rt]=T[ls[rt]]+T[rs[rt]];
}

int query(int l,int r,int lst,int rt)
{
	if(!(T[rt]-T[lst])) return 0;
	if(l==r) return l;
	if(qr<=mid) return query(l,mid,ls[lst],ls[rt]);
	if(ql>mid) return query(mid+1,r,rs[lst],rs[rt]);
	int ret=query(mid+1,r,rs[lst],rs[rt]);
	if(!ret) return query(l,mid,ls[lst],ls[rt]);
	return ret;
}

void addedge(int u,int v)
{
	e[cnt]=(edge){v,h[u]},h[u]=cnt++;
}

struct Sam
{
	int fa[N<<1],len[N<<1],rk[N<<1],g[N<<1],bin[N];
	int lst,tot,trf[N<<1][30];

	void init()
	{
		rep(i,1,tot)
		{
			fa[i]=len[i]=rk[i]=g[i]=0;
			rep(j,0,25) trf[i][j]=0;
		}
		lst=tot=1;
	}

	void ins(int c)
	{
		int u=lst,v,x=++tot;
		lst=tot,len[x]=len[u]+1;
		for(; u && !trf[u][c]; trf[u][c]=x,u=fa[u]);
		if(!u) fa[x]=1;
		else if(len[u]+1==len[v=trf[u][c]]) fa[x]=v;
		else
		{
			int w=++tot;
			len[w]=len[u]+1,fa[w]=fa[v];
			memcpy(trf[w],trf[v],sizeof(trf[v]));
			for(fa[x]=fa[v]=w; u && trf[u][c]==v; trf[u][c]=w,u=fa[u]);
		}
	}

	void dfs(int x)
	{
		dfn[x]=++*dfn,siz[x]=1;
		for(int i=h[x]; i!=-1; i=e[i].n)
			dfs(e[i].v),siz[x]+=siz[e[i].v];
	}	

	void build()
	{
		memset(h,-1,sizeof(h));
		rep(i,2,tot) addedge(fa[i],i);
		dfs(1);
		int p=1;
		rep(i,1,n) pos[dfn[p=trf[p][s[i]-'a']]]=i;
		rep(i,1,tot)
			if(pos[i]) ::ins(1,n,root[i-1],root[i],pos[i]);
			else root[i]=root[i-1];
	}

	bool check(int l,int x)
	{
		if(!x) return 1;
		int p=::query(1,n,root[dfn[x]-1],root[dfn[x]+siz[x]-1]);
		return !p || p-l+1<ql;
	}

	void get_mx()
	{
		int p=1,nw=0;
		rep(i,1,m)
		{
			while(p && check(nw+1,trf[p][t[i]-'a'])) p=fa[p],nw=len[p];
			if(!p) p=1,nw=0;
			else p=trf[p][t[i]-'a'],++nw;
			mx[i]=nw;
		}
	}

	void query()
	{
		int p=1;
		ans=0;
		rep(i,1,m) p=trf[p][t[i]-'a'],g[p]=mx[i];
		rep(i,0,m) bin[i]=0;
		rep(i,1,tot) ++bin[len[i]];
		rep(i,1,m) bin[i]+=bin[i-1];
		rep(i,1,tot) rk[bin[len[i]]--]=i;
		repd(i,tot,1)
		{
			int x=rk[i];
			g[fa[x]]=max(g[fa[x]],g[x]);
			if(len[x]>g[x]) ans+=min(len[x]-g[x],len[x]-len[fa[x]]);
		}
		printf("%lld\n",ans);
	}
} t1,t2;

int getint()
{
	char ch;
	while(!isdigit(ch=getchar()));
	int x=ch-48;
	while(isdigit(ch=getchar())) x=x*10+ch-48;
	return x;
}

int main()
{
	scanf("%s",s+1),n=strlen(s+1);
	t1.init();
	rep(i,1,n) t1.ins(s[i]-'a');
	t1.build();
	q=getint();
	while(q--)
	{
		scanf("%s",t+1),ql=getint(),qr=getint();
		m=strlen(t+1);
		t2.init();
		rep(i,1,m) t2.ins(t[i]-'a');
		t1.get_mx();
		t2.query();
	}
	return 0;
}

CompilationN/AN/ACompile OKScore: N/A

Testcase #14.837 ms4 MB + 28 KBAcceptedScore: 4

Testcase #26.966 ms4 MB + 320 KBAcceptedScore: 4

Testcase #37.257 ms4 MB + 320 KBAcceptedScore: 4

Testcase #487.286 ms4 MB + 836 KBAcceptedScore: 4

Testcase #583.805 ms4 MB + 832 KBAcceptedScore: 4

Testcase #6914.308 ms339 MB + 880 KBAcceptedScore: 4

Testcase #7913.985 ms339 MB + 808 KBAcceptedScore: 4

Testcase #8127.026 ms50 MB + 824 KBAcceptedScore: 4

Testcase #9269.297 ms46 MB + 376 KBAcceptedScore: 4

Testcase #10305.463 ms96 MB + 652 KBAcceptedScore: 4

Testcase #11653.346 ms90 MB + 760 KBAcceptedScore: 4

Testcase #12525.043 ms143 MB + 32 KBAcceptedScore: 4

Testcase #131.077 s136 MB + 864 KBAcceptedScore: 4

Testcase #14747.219 ms191 MB + 16 KBAcceptedScore: 4

Testcase #151.528 s184 MB + 244 KBAcceptedScore: 4

Testcase #16974.016 ms239 MB + 32 KBAcceptedScore: 4

Testcase #171.989 s231 MB + 892 KBAcceptedScore: 4

Testcase #18772.382 ms106 MB + 540 KBAcceptedScore: 4

Testcase #19914.059 ms149 MB + 788 KBAcceptedScore: 4

Testcase #201.038 s194 MB + 100 KBAcceptedScore: 4

Testcase #211.114 s239 MB + 168 KBWrong AnswerScore: 0

Testcase #221.155 s238 MB + 1004 KBAcceptedScore: 4

Testcase #231.142 s238 MB + 936 KBAcceptedScore: 4

Testcase #241.154 s239 MB + 132 KBAcceptedScore: 4

Testcase #251.138 s239 MB + 180 KBAcceptedScore: 4


Judge Duck Online | 评测鸭在线
Server Time: 2026-04-13 20:47:12 | Loaded in 1 ms | Server Status
个人娱乐项目,仅供学习交流使用 | 捐赠