답안 #928935

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
928935 2024-02-17T08:35:59 Z UmairAhmadMirza Necklace (Subtask 1-3) (BOI19_necklace1) C++14
25 / 85
197 ms 8016 KB
#include <bits/stdc++.h>
using namespace std;
#define int long long
int const N=405;
int const mod=1e8+7;
int const base=1e5+237;
int hsh1[N][N];
int hsh2[N][N];
int r_hsh1[N][N];
int r_hsh2[N][N];
int min_hsh1[N][N];
int min_hsh2[N][N];
// map<int,bool> mp1[N];
// map<int,bool> mp2;
int pw[N];
string a,b;
void make_hash1(){
  int n=a.length();
  for(int i=1;i<=n;i++){
    int h1=0;
    for(int j=i;j<=n;j++){
      h1*=base;
      h1%=mod;
      h1+=a[j-1];
      h1%=mod;
      hsh1[i][j]=h1;
    }
  }
  for(int i=n;i>=1;i--){
    int h1=0;
    for(int j=i;j>=1;j--){
      h1*=base;
      h1%=mod;
      h1+=a[j-1];
      h1%=mod;
      r_hsh1[j][i]=h1;
    }
  }
}
void make_hash2(){
  int n=b.length();
  for(int i=1;i<=n;i++){
    int h1=0;
    for(int j=i;j<=n;j++){
      h1*=base;
      h1%=mod;
      h1+=b[j-1];
      h1%=mod;
      hsh2[i][j]=h1;
    }
  }
  for(int i=n;i>=1;i--){
    int h1=0;
    for(int j=i;j>=1;j--){
      h1*=base;
      h1%=mod;
      h1+=b[j-1];
      h1%=mod;
      r_hsh2[j][i]=h1;
    }
  }
}
void set_hsh1(){
  int n=a.length();
  int h=0;
  for(int i=1;i<=n;i++)
    for(int j=i;j<=n;j++){
      min_hsh1[i][j]=hsh1[i][j];
      for(int k=i;k<=j;k++){
        h=(hsh1[k][j]%mod)*(pw[k-i]%mod)%mod;
        h+=hsh1[i][k-1]%mod;
        h%=mod;
        min_hsh1[i][j]=min(min_hsh1[i][j],h);
      }
      // cout<<i<<' '<<j<<' '<<min_hsh1[i][j]<<endl;
    }
  
  for(int i=1;i<=n;i++)
    for(int j=i;j<=n;j++){
      // min_hsh1[i][j]=hsh2[i][j];
      for(int k=i;k<=j;k++){
        h=(r_hsh1[i][k]*pw[j-k])%mod;
        h+=r_hsh1[k+1][j];
        h%=mod;
        min_hsh1[i][j]=min(min_hsh1[i][j],h);
      }
      // cout<<i<<' '<<j<<' '<<min_hsh1[i][j]<<endl;
    }
}
void set_hsh2(){
  int n=b.length();
  int h=0;
  for(int i=1;i<=n;i++)
    for(int j=i;j<=n;j++){
      min_hsh2[i][j]=hsh2[i][j];
      for(int k=i;k<=j;k++){
        h=(hsh2[k][j]*pw[k-i])%mod;
        h+=hsh2[i][k-1]%mod;
        h%=mod;
        min_hsh2[i][j]=min(min_hsh2[i][j],h);
      }
      // cout<<i<<' '<<j<<' '<<min_hsh2[i][j]<<endl;
    }
  
  for(int i=1;i<=n;i++)
    for(int j=i;j<=n;j++){
      for(int k=i;k<=j;k++){
        h=(r_hsh2[i][k]*pw[j-k])%mod;
        h+=r_hsh2[k+1][j];
        h%=mod;
        min_hsh2[i][j]=min(min_hsh2[i][j],h);
      }
      // cout<<i<<' '<<j<<' '<<min_hsh2[i][j]<<endl;
    }
}
void pwer(){
  pw[0]=1;
  for(int i=1;i<N;i++)
    pw[i]=(pw[i-1]*base)%mod;
}
 
signed main() 
{
  cin>>a>>b;
  pwer();
  make_hash1();
  make_hash2();
  set_hsh1();
  set_hsh2();
  int n=a.length();
  int m=b.length();
  for(int l=min(n,m)-1;l>=0;l--)
    for(int i=1;i<=(n-l);i++)
      for(int j=1;j<=m-l;j++){
        if(min_hsh1[i][i+l]==min_hsh2[j][j+l]){
          cout<<l+1<<endl;
          cout<<i-1<<' '<<j-1<<endl;
          return 0;
        }
      }
}
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 7000 KB Output is correct
2 Correct 4 ms 7004 KB Output is correct
3 Correct 3 ms 7004 KB Output is correct
4 Correct 4 ms 7004 KB Output is correct
5 Correct 4 ms 7004 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 7000 KB Output is correct
2 Correct 4 ms 7004 KB Output is correct
3 Correct 3 ms 7004 KB Output is correct
4 Correct 4 ms 7004 KB Output is correct
5 Correct 4 ms 7004 KB Output is correct
6 Correct 197 ms 7928 KB Output is correct
7 Correct 181 ms 7940 KB Output is correct
8 Correct 149 ms 7984 KB Output is correct
9 Incorrect 166 ms 8016 KB Output isn't correct
10 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 7000 KB Output is correct
2 Correct 4 ms 7004 KB Output is correct
3 Correct 3 ms 7004 KB Output is correct
4 Correct 4 ms 7004 KB Output is correct
5 Correct 4 ms 7004 KB Output is correct
6 Correct 197 ms 7928 KB Output is correct
7 Correct 181 ms 7940 KB Output is correct
8 Correct 149 ms 7984 KB Output is correct
9 Incorrect 166 ms 8016 KB Output isn't correct
10 Halted 0 ms 0 KB -