QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#848969 | #8701. Border | tongzhenxuan# | 0 | 3ms | 16180kb | C++14 | 3.3kb | 2025-01-09 11:02:02 | 2025-01-09 11:02:02 |
Judging History
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%