Submission #747835

#TimeUsernameProblemLanguageResultExecution timeMemory
747835HyojinMatching (CEOI11_mat)C++17
100 / 100
1595 ms53556 KiB
#include <bits/stdc++.h>
using namespace std;
#define bit(n,i) ((n>>i)&1) 
#define all(a) (a).begin(),(a).end()
#define pb push_back
#define ep emplace_back
#define pii pair<int,int>
#define piii pair<int,pii> 
#define fi first
#define se second
#define ll long long
#define deb(x) cerr << #x << ' ' << x << '\n'
const int MOD=1e9+7;
const int N=1e6+5;
void setIO(const string &NAME)
{
	if (NAME.size())
	{
		freopen((NAME+".inp").c_str(),"r",stdin);
		freopen((NAME+".out").c_str(),"w",stdout);
	}
}
int mul(int a,int b){return (1ll*a*b)%MOD;}
int add(int a,int b){return (a+b)%MOD;}
int sub(int a,int b){return (a-b+MOD)%MOD;}
int n,m,b[N],hashA,sum1[N],Pow[N],st[N*4],cnt[N*4],lazy[N*4];
int base;
vector<int>f;
void down(int id)
{	
	if (lazy[id]!=0)
	{
		int x=lazy[id];
		st[id<<1]=sub(st[id<<1],mul(x,sum1[cnt[id<<1]]));
		st[id<<1|1]=sub(st[id<<1|1],mul(x,sum1[cnt[id<<1|1]]));
		lazy[id<<1]+=x;
		lazy[id<<1|1]+=x;
		lazy[id]=0;
	}
}
void update(int id,int l,int r,int x,int val)
{
	if (x<l||r<x) return;
	if (l==r)
	{
		if (val!=-1) 
		{
			st[id]=val;
			cnt[id]=1;
		}
		else
		{
			cnt[id]=0;
			st[id]=0;
		}
		return;
	}
	down(id);
	int mid=l+r>>1;
	update(id<<1,l,mid,x,val);
	update(id<<1|1,mid+1,r,x,val);
	st[id]=add(st[id<<1|1],mul(st[id<<1],Pow[cnt[id<<1|1]]));
	cnt[id]=cnt[id<<1]+cnt[id<<1|1];
}
int main()
{
	ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	#ifdef izumiShiho
    	setIO("input");
	#endif //izumiShiho
    cin>>n>>m;
    base=n+5;
    Pow[0]=1;
    sum1[0]=0;
    for (int i=1;i<=n;i++)
    {
    	Pow[i]=mul(Pow[i-1],base);
    	sum1[i]=add(mul(sum1[i-1],base),1);
    	int x;
    	cin>>x;
    	hashA=add(mul(hashA,base),x);
    }
    for (int i=1;i<=m;i++)
    {
    	cin>>b[i];
    	f.pb(b[i]);
    }
    sort(all(f));
    for (int i=1;i<=m;i++) b[i]=lower_bound(all(f),b[i])-f.begin()+1;
    for (int i=1;i<=n;i++) update(1,1,m,b[i],i);
    vector<int>ans;
    if (hashA==st[1]) ans.pb(1);
    for (int i=n+1;i<=m;i++)
    {
    	update(1,1,m,b[i-n],-1);
    	lazy[1]++;
    	sub(st[1],sum1[n]);
    	update(1,1,m,b[i],n);
    	if (st[1]==hashA) ans.pb(i-n+1);
    }
   	cout<<ans.size()<<"\n";
   	for (int x:ans) cout<<x<<' ';
	return 0;
}

Compilation message (stderr)

mat.cpp: In function 'void update(int, int, int, int, int)':
mat.cpp:59:11: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   59 |  int mid=l+r>>1;
      |          ~^~
mat.cpp: In function 'void setIO(const string&)':
mat.cpp:19:10: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   19 |   freopen((NAME+".inp").c_str(),"r",stdin);
      |   ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
mat.cpp:20:10: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   20 |   freopen((NAME+".out").c_str(),"w",stdout);
      |   ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...