月赛C题求调
  • 板块学术版
  • 楼主Lysea
  • 当前回复5
  • 已保存回复5
  • 发布时间2023/7/8 18:20
  • 上次更新2023/11/3 11:01:20
查看原帖
月赛C题求调
616733
Lysea楼主2023/7/8 18:20

第10个点T掉了......

#include<bits/stdc++.h>
#define int long long
#define N 5000005
using namespace std;
int n,m,a[N],b[N],num[N],cnt[N],kmp[N],tot,k,l1,l2,p,ans,fl,c1,c2,d1,d2;
char s1[N],s2[N];
int gcd(int x,int y){
	return y?gcd(y,x%y):x;
}
signed main(){
	ios::sync_with_stdio(false);
	cin>>n>>m
	for(int i=1;i<=n;i++) cin>>a[i],s1[l1++]=(a[i]+'0');
	for(int i=1;i<=m;i++){
		cin>>b[i];
		if(i!=1&&b[i]!=b[i-1]) fl++;
	}
	if(!fl) goto A;
	if(fl==1) goto B;
	for(int i=1,j;i<=m;i++){
		j=i;
		while(b[j+1]==b[j]&&j<m) j++;
		num[++tot]=b[j],cnt[tot]=j-i+1;
		i=j;
	}
	k=cnt[1];
	for(int i=2;i<=tot;i++) k=gcd(k,cnt[i]);
	for(int i=1;i<=tot;i++) cnt[i]/=k;
	m/=k;
	for(int i=1;i*m<=n;i++){
		l2=0;
		for(int j=1;j<=tot;j++){
			for(int q=1;q<=cnt[j]*i;q++){
				s2[l2++]=(num[j]+'0');
			}
		}
		p=0;
    	kmp[0]=kmp[1]=0;
	    for(int j=1;j<l2;j++){  
		    while(p&&s2[j]!=s2[p]) p=kmp[p];    
	        if(s2[p]==s2[j]) kmp[j+1]=++p;    
	    	else kmp[j+1]=0;
	    }
	    p=0;
	    for(int j=0;j<l1;j++){
	        while(p&&s2[p]!=s1[j]) p=kmp[p];
	        if(s2[p]==s1[j]) p++;
	        if(p==l2){
				ans++;
				p=kmp[p];
			}
	    }
	}
	cout<<ans;
	return 0;
	A:
	for(int i=1;i<=n;i++){
		if(a[i]!=b[1]){
			if(k<=m) ans+=(1+k)*k/2;
			else ans+=(1+k*2-m)*m/2;
			k=0;
		}else k++;
	}
	ans+=(1+k)*k/2;
	cout<<ans;
    return 0;
    B:
    for(int i=1;i<=m;i++){
    	if(i!=1&&b[i]!=b[i-1]){
    		d1=i-1;
    		break;
		}
	}
	d2=m-d1;
	k=gcd(d1,d2);
	d1/=k,d2/=k;
    for(int i=1;i<=n;i++){
		if(a[i]!=b[m]&&a[i]!=b[1]||a[i]==b[1]&&c2||a[i]==b[m]&&(!c1)){
			c1/=d1,c2/=d2;
			ans+=min(c1,c2);
			c1=c2=0;
			if(a[i]==b[1]) c1=1;
		}
		else if(a[i]==b[1]) c1++;
		else if(a[i]==b[m]) c2++;
		
	}
	c1/=d1,c2/=d2;
	ans+=min(c1,c2);
	cout<<ans;
	return 0;
}
2023/7/8 18:20
加载中...