QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#848969#8701. Bordertongzhenxuan#0 3ms16180kbC++143.3kb2025-01-09 11:02:022025-01-09 11:02:02

Judging History

你现在查看的是最新测评结果

  • [2025-01-09 11:02:02]
  • 评测
  • 测评结果:0
  • 用时:3ms
  • 内存:16180kb
  • [2025-01-09 11:02:02]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
#define maxn 2000005
#define ll int
char a[maxn],b[maxn];
int nxt[maxn],res[maxn],ans[maxn],vis[maxn],n;
const ll mod1=1e9+7,mod2=20090723,bas=19491001;
ll hsh1[maxn],pw1[maxn],pw2[maxn],hsh2[maxn];
int ck(int l1,int r1,int l2,int r2,int op){
    int h1=(1ll*hsh1[r1]-1ll*hsh1[l1-1]*pw1[r1-l1+1]%mod1+mod1)%mod1;
    int h2=(1ll*hsh1[r2]-1ll*hsh1[l2-1]*pw1[r2-l2+1]%mod1+mod1)%mod1;
    int h3=(1ll*hsh2[r1]-1ll*hsh2[l1-1]*pw2[r1-l1+1]%mod2+mod2)%mod2;
    int h4=(1ll*hsh2[r2]-1ll*hsh2[l2-1]*pw2[r2-l2+1]%mod2+mod2)%mod2;
    if(op!=0 && l1<=op && op<=r1) {
        h1=(1ll*h1-1ll*pw1[r1-op]*(a[op]-'a'+1)%mod1+1ll*pw1[r1-op]*(b[op]-'a'+1)%mod1+mod1)%mod1;
        h3=(1ll*h3-1ll*pw2[r1-op]*(a[op]-'a'+1)%mod2+1ll*pw2[r1-op]*(b[op]-'a'+1)%mod2+mod2)%mod2;
    }
    if(op!=0 && l2<=op && op<=r2) {
        h2=(1ll*h2-1ll*pw1[r2-op]*(a[op]-'a'+1)%mod1+1ll*pw1[r2-op]*(b[op]-'a'+1)%mod1+mod1)%mod1;
        h4=(1ll*h4-1ll*pw2[r2-op]*(a[op]-'a'+1)%mod2+1ll*pw2[r2-op]*(b[op]-'a'+1)%mod2+mod2)%mod2;
    }
    return h1==h2 && h3==h4;
}
int main(){
    // freopen("data.in","r",stdin);
    // freopen("data.out","w",stdout);
    // ios::sync_with_stdio(false);
    // cin.tie(nullptr);cout.tie(nullptr);
    // cin>>a+1>>b+1;
    scanf("%s",a+1);scanf("%s",b+1);
    n=strlen(a+1);
    int j=0;
    pw2[0]=pw1[0]=1;
    for(int i=1;i<=n;i++) pw1[i]=1ll*pw1[i-1]*bas%mod1,pw2[i]=1ll*pw2[i-1]*bas%mod2;
    for(int i=1;i<=n;i++) 
        hsh1[i]=(1ll*hsh1[i-1]*bas+(a[i]-'a'+1))%mod1,
        hsh2[i]=(1ll*hsh2[i-1]*bas+(a[i]-'a'+1))%mod2;
    for(int i=2;i<=n;i++){
        while(j && a[i]!=a[j+1]) j=nxt[j];
        j+=(a[i]==a[j+1]);
        nxt[i]=j;
    }
    for(int i=1;i<=n;i++)if(a[i]==b[i])ans[i]=nxt[n];
    for(int len=n/2;len>=1;len--)
        if(!ck(1,len,n-len+1,n,0)){
            int l=1,r=len,mid,tmp=0,p=n-len;
            while(l<=r){
                mid=(l+r)>>1;
                if(!ck(1,mid,p+1,p+mid,0)) tmp=mid,r=mid-1;
                else l=mid+1;
            }
            if(ck(1,len,p+1,p+len,tmp)) ans[tmp]=max(ans[tmp],len);
            if(ck(1,len,p+1,p+len,p+tmp)) ans[p+tmp]=max(ans[p+tmp],len);
        }
        else {
            for(int i=len+1;i<=(n+1)/2;i++) if(!res[i]) res[i]=len;else break;
            for(int i=n-len;i> (n+1)/2;i--) if(!res[i]) res[i]=len;else break;
        }
    //repeat
    for(int len=n-1;len>n/2;len--){
        int t=n-len,tmp=0,cnt=0;
        // vis[0]=vis[(n-1)/t+1]=1;
        for(int i=0;i+t<n && cnt<=4;i+=t)
            vis[i/t+1]=!ck(i+1,i+min(n-i-t,t),i+1+t,i+t+min(n-i-t,t),0),
            cnt+=vis[i/t+1];
        for(int i=t;i+t<n && cnt<=1;i+=t)
            cnt+=(vis[i/t]==1 && vis[i/t+1]==1);
        if(cnt>1) continue;
        for(int i=0;i+t<n;i+=t) if(vis[i/t+1]==1){
            int p=i+t,l=1,r=min(t,n-p),mid;
            while(l<=r){
                mid=(l+r)>>1;
                if(!ck(i+1,i+mid,p+1,p+mid,0)) tmp=mid,r=mid-1;
                else l=mid+1;
            }
            tmp=i+tmp;
            if((vis[i/t] || i==0) && ck(1,len,n-len+1,n,tmp)) ans[tmp]=max(ans[tmp],len);
            tmp=tmp-i+p;
            if(vis[i/t+1] && ck(1,len,n-len+1,n,tmp)) ans[tmp]=max(ans[tmp],len);
        }
    }
    for(int i=1;i<=n;i++) printf("%d\n",max(res[i],ans[i]));
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Subtask #1:

score: 0
Wrong Answer

Test #1:

score: 23
Accepted
time: 3ms
memory: 16180kb

input:

cbaababaabacbaababaabacbaabacbaababaabacbaaba
dabbababbabaabbafabbgbaabfebaabzababbayaabcac

output:

0
0
0
0
0
0
6
6
6
6
6
6
6
6
6
6
6
17
17
17
17
17
17
17
17
17
17
17
6
6
6
6
6
6
6
6
6
6
6
0
0
0
3
0
1

result:

ok 45 numbers

Test #2:

score: 0
Wrong Answer
time: 2ms
memory: 16116kb

input:

cbaababaabacbaabadbaababaabacbaabacbaaba
aabwaxjbbabtalbabcasbabibbabaabbabaabiac

output:

3
0
0
0
0
0
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
0
0
0
0
0
1

result:

wrong answer 18th numbers differ - expected: '23', found: '6'

Subtask #2:

score: 0
Skipped

Dependency #1:

0%

Subtask #3:

score: 0
Skipped

Dependency #1:

0%

Subtask #4:

score: 0
Skipped

Dependency #1:

0%