제출 #1152016

#제출 시각아이디문제언어결과실행 시간메모리
1152016sasdeLampice (COCI19_lampice)C++17
110 / 110
2101 ms20672 KiB
#include<bits/stdc++.h>
#define int long long
#define str string
#define task "strdel"
#define ii pair<int,int>
#define iii pair<int,ii>
#define iv pair<ii,ii>
#define se second
#define fi first
#define ffi fi.fi
#define sfi se.fi
#define sse se.se
#define fse fi.se
#define lt(i, c, d) for(int i = c; i <= d; ++i)
#define fl(i, c, d) for(int i = d; i >= c; --i)
#define pb push_back
#define emb emplace_back
#define emf emplace_front
#define em emplace
using namespace std;
const int N=5e4+5,lg=20,mod=1e9+3,base=31;
mt19937 rd(chrono::steady_clock::now().time_since_epoch().count());
int Rand(int u,int v){
 return u+rd()%(v-u+1);
}
int n,c[N],ans=1,sz[N],fup[N],fd[N],h[N],up[N][lg+5];
string s;
vector<int>a[N];
bool k[N];
void dfs(int u,int cha){
  sz[u]=1;
  for(int v:a[u]){
    if(v==cha||k[v])continue;
    dfs(v,u);
    sz[u]+=sz[v];
  }
}
int fin(int u,int cha,int n){
  for(int v:a[u]){
    if(v!=cha&&!k[v]&&sz[v]>n/2)return fin(v,u,n);

  }
  return u;
}
bool ok=false;
vector<int>node;
vector<ii>store[N];
void calc(int u,int cha){
  node.emb(u);
  store[h[u]].emb(fd[u],u);
  for(int j=1;j<=lg;++j)
    up[u][j]=up[up[u][j-1]][j-1];
  for(int v:a[u]){
    if(v==cha||k[v])continue;
    up[v][0]=u;
    h[v]=h[u]+1;
    fd[v]=(fd[u]*base+s[v]-'a'+1)%mod;
    fup[v]=(fup[u]+(s[v]-'a'+1)*c[h[u]])%mod;
    calc(v,u);
  }
}
int lift(int x,int k){
 for(int i=lg;i>=0;--i){
  if(k>=(1LL<<i)){
    k-=(1LL<<i);
    x=up[x][i];
  }
 }
 return x;
}
int gethash(int u,int v){
  return ((fd[u]-fd[up[v][0]]*c[h[u]-h[v]+1])%mod+mod)%mod;
}
int lca(int u,int v){
  if(h[u]<h[v])swap(u,v);
  for(int j=lg;j>=0;--j){
    if(h[u]-h[v]>=(1<<j))u=up[u][j];
  }
  if(u==v)return u;
   for(int j=lg;j>=0;--j){
    if(up[u][j]!=up[v][j]){
      u=up[u][j];
      v=up[v][j];
    }
   }

  return up[u][0];

}
void giai(int u,int cha,int mid){
    fup[u]=s[u]-'a'+1;
    fd[u]=s[u]-'a'+1;;
    node.clear();
    up[u][0]=0;
    h[u]=1;
    calc(u,cha);
    for(int i=1;i<=n;++i){
      if(store[i].empty())break;
      sort(store[i].begin(),store[i].end());
      // cout <<i<<" ";
    }
    // cout<<'\n';
    // cout <<node.size()<<" ";
    for(int i:node){
      if(ok)break;
      int dep=mid-h[i]+1;
      // cout <<i<<" "<<dep<<'\n';
      if(dep>h[i]||dep<1)continue;
      int X=lift(i,dep-1);
      if(fd[X]!=fup[X])continue;;
      int tmp=gethash(i,X);
      int l=lower_bound(store[dep].begin(),store[dep].end(),make_pair(tmp,0LL))-store[dep].begin();
      if(l==store[dep].size()||store[dep][l].fi!=tmp)continue;
      while(l<store[dep].size()){
        if(store[dep][l].fi!=tmp)break;
        if(lca(i,store[dep][l].se)==u){
          ok=true;
          break;
        }
        ++l;
      }
    }
    for(int i=1;i<=n;++i){
            if(store[i].empty())break;
      // sort(store[i].begin(),store[i].end());
            store[i].clear();
    }

}
void cen(int u,int mid){
  if(ok)return;
  // cout <<u<<" "
  dfs(u,u);
  int g=fin(u,u,sz[u]);
  k[g]=true;
  giai(g,u,mid);
  for(int v:a[g]){
    if(k[v])continue;
  // if(ok)return;

    cen(v,mid);
  }
}
void solve(){
  cin >> n >>s;
  for(int i=1;i<n;++i){
    int u,v;
    cin >> u >> v;
    a[u].emb(v);
    a[v].emb(u);
  }
  s=" "+s;
  c[0]=1;
  for(int i=1;i<=n;++i)c[i]=(c[i-1]*base)%mod;
    // chatle();
  int r=1,l=n/2;
  while(r<=l){
    ok=false;
    for(int i=1;i<=n;++i)k[i]=false;
    int mid=(r+l)>>1LL;
    cen(1,mid*2);

    if(ok){
      ans=max(ans,mid*2);
      r=mid+1;
    }
    else l=mid-1;
  }
    r=1,l=n/2;
  while(r<=l){
    for(int i=1;i<=n;++i)k[i]=false;
    ok=false;
    int mid=(r+l)>>1LL;
    cen(1,mid*2+1);
    // cout <<mid<<'\n';
    if(ok){
      ans=max(ans,mid*2+1);
      r=mid+1;
    }
    else l=mid-1;
  }

  cout << ans;
}
main()
{
  srand(time(0));
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    if(fopen(task".inp","r")){
      freopen(task".inp","r",stdin);
      freopen(task".out","w",stdout);
    }
    int t=1;
 //   cin >> t;
while(t--){
    solve();
    cout<<'\n';
}

}

컴파일 시 표준 에러 (stderr) 메시지

lampice.cpp:185:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
  185 | main()
      | ^~~~
lampice.cpp: In function 'int main()':
lampice.cpp:192:14: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  192 |       freopen(task".inp","r",stdin);
      |       ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
lampice.cpp:193:14: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  193 |       freopen(task".out","w",stdout);
      |       ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...