QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#848908 | #8701. Border | tongzhenxuan# | 0 | 0ms | 0kb | C++14 | 3.0kb | 2025-01-09 10:41:56 | 2025-01-09 10:42:04 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
#define maxn 2000005
#define ll long long
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){
long long h1=(hsh1[r1]-hsh1[l1-1]*pw1[r1-l1+1]%mod1+mod1)%mod1;
long long h2=(hsh1[r2]-hsh1[l2-1]*pw1[r2-l2+1]%mod1+mod1)%mod1;
long long h3=(hsh2[r1]-hsh2[l1-1]*pw2[r1-l1+1]%mod2+mod2)%mod2;
long long h4=(hsh2[r2]-hsh2[l2-1]*pw2[r2-l2+1]%mod2+mod2)%mod2;
if(op!=0 && l1<=op && op<=r1) {
h1=(h1-pw1[r1-op]*(a[op]-'a'+1)%mod1+pw1[r1-op]*(b[op]-'a'+1)%mod1+mod1)%mod1;
h3=(h3-pw2[r1-op]*(a[op]-'a'+1)%mod2+pw2[r1-op]*(b[op]-'a'+1)%mod2+mod2)%mod2;
}
if(op!=0 && l2<=op && op<=r2) {
h2=(h2-pw1[r2-op]*(a[op]-'a'+1)%mod1+pw1[r2-op]*(b[op]-'a'+1)%mod1+mod1)%mod1;
h4=(h4-pw2[r2-op]*(a[op]-'a'+1)%mod2+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);
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]=pw1[i-1]*bas%mod1,pw2[i]=pw2[i-1]*bas%mod2;
for(int i=1;i<=n;i++)
hsh1[i]=(hsh1[i-1]*bas+(a[i]-'a'+1))%mod1,
hsh2[i]=(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;i+=t)
vis[i/t+1]=!ck(i+1,i+t,i+1+t,i+2*t,0);
for(int i=t;i+t<n;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(ck(1,len,n-len+1,n,tmp)) ans[tmp]=max(ans[tmp],len);
tmp=tmp-i+p;
if(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
Dangerous Syscalls
Test #1:
score: 0
Dangerous Syscalls
input:
cbaababaabacbaababaabacbaabacbaababaabacbaaba dabbababbabaabbafabbgbaabfebaabzababbayaabcac
output:
result:
Subtask #2:
score: 0
Skipped
Dependency #1:
0%
Subtask #3:
score: 0
Skipped
Dependency #1:
0%
Subtask #4:
score: 0
Skipped
Dependency #1:
0%