社区讨论

萌新求助

学术版参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mi7x0ask
此快照首次捕获于
2025/11/21 04:59
4 个月前
此快照最后确认于
2025/11/21 04:59
4 个月前
查看原帖
P5270
得分链接https://www.luogu.org/recordnew/show/17657484
CPP
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<cmath>
#include<vector>
#include<deque>
using namespace std;
typedef long long ll;
const ll N=1e5+10,P=1e5+7,mod=1e9+7;
int i,j,n,t,k,m,len[N],r[N];ll ans,s,c[N],p[N];vector<ll> hash[N];
struct node{int len,id;node(int _x,int _y){id=_x;len=_y;}};deque<node> q;
inline ll read(){
	ll x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
	return x*f;
}
inline ll getans(int id,int length){
	int l=len[id]-length+1;
	return ((hash[id][len[id]]-hash[id][l-1])%mod+mod)%mod;
}
int main(){
	n=read();t=read();k=read();
	p[0]=1;for(i=1;i<=N-10;i++) p[i]=p[i-1]*P%mod;
	for(i=1;i<=t;i++){int x=read();s=(s+p[x])%mod;}
	for(i=1;i<=n;i++){
		len[i]=read();ll tmp=0;hash[i].push_back(tmp);
		for(j=1;j<=len[i];j++){
			int x=read();tmp=(tmp+p[x])%mod;hash[i].push_back(tmp);	
		}
	}
	m=read();for(i=1;i<=m;i++) r[i]=read();
	if(k<=m){
		ll now=0,pos=0;
		for(i=1;i<=k;i++){
			now+=hash[r[i]][len[r[i]]];pos+=len[r[i]];
			q.push_back(node(r[i],len[r[i]]));
			while(pos>t){
				node c=q.front();q.pop_front();
				if(pos-c.len>=t) now=((now-getans(c.id,c.len))%mod+mod)%mod,pos-=c.len;
				else{
					ll del=pos-t,length=c.len-del;pos-=del;
					now=((now-getans(c.id,c.len))%mod+mod)%mod;
					now=(now+getans(c.id,length))%mod;
					q.push_front(node(c.id,length));
				}
			}
			if(now==s) ans++;
		}
		printf("%lld\n",ans);
	}
	else{
		ll now=0,pos=0;
		for(i=1;i<=m;i++){
			now+=hash[r[i]][len[r[i]]];pos+=len[r[i]];
			q.push_back(node(r[i],len[r[i]]));
			while(pos>t){
				node c=q.front();q.pop_front();
				if(pos-c.len>=t) now=((now-getans(c.id,c.len))%mod+mod)%mod,pos-=c.len;
				else{
					ll del=pos-t,length=c.len-del;pos-=del;
					now=((now-getans(c.id,c.len))%mod+mod)%mod;
					now=(now+getans(c.id,length))%mod;
					q.push_front(node(c.id,length));
				}
			}
			ans+=(now==s);
		}
		for(i=1,k-=m;i<=m;i++){
			now+=hash[r[i]][len[r[i]]];pos+=len[r[i]];
			q.push_back(node(r[i],len[r[i]]));
			while(pos>t){
				node c=q.front();q.pop_front();
				if(pos-c.len>=t) now=((now-getans(c.id,c.len))%mod+mod)%mod,pos-=c.len;
				else{
					ll del=pos-t,length=c.len-del;pos-=del;
					now=((now-getans(c.id,c.len))%mod+mod)%mod;
					now=(now+getans(c.id,length))%mod;
					q.push_front(node(c.id,length));
				}
			}
			c[i]=c[i-1]+(now==s);
		}
		ans+=c[m]*(k/m);ans+=c[k%m];
		printf("%lld\n",ans);
	}
	return 0;
}
第三组数据错得十分诡异,看一看范围好像也没什么坑点啊(大佬勿喷)。

回复

2 条回复,欢迎继续交流。

正在加载回复...