Submission #1116645

#TimeUsernameProblemLanguageResultExecution timeMemory
1116645son2008Lampice (COCI19_lampice)C++14
42 / 110
5045 ms175912 KiB
#include<bits/stdc++.h>
using namespace std;
#define task "noel"
#define ii pair<int,int>
#define fi first
#define se second
#define int long long
#define ll long long
#define ld double
#define mp make_pair
#define lg2 30
#define iii pair<int,ii>
#define iiii pair<ii,ii>
#define fii fi.fi
#define fis fi.se3
#define sfi se.fi
#define see se.se
#define base 29
int dx[]={0LL,0LL,1,-1,1,1,-1,-1};
int dy[]={1,-1,0LL,0LL,1,-1,1,-1};
const int maxn=5e4+1;
const int mod=1e9+7;
int h[maxn],n;
char s[maxn];
vector<int>a[maxn];
void dfs(int u,int cha)
{
    for(int v:a[u])
    {
        if(v==cha)continue;
        h[v]=h[u]+1;
        dfs(v,u);
    }
}
namespace sub2
{
    int h[50068],p[50068],hr[50068];
    int getl(int l,int r){
	return (h[r]-h[l-1]*p[r-l+1]%mod+mod)%mod;
    }
    int getr(int i, int j) {
    return (hr[i] - hr[j+1] * p[j-i+1]%mod+mod)%mod;
    }
    bool check(int i,int j){
    return (getl(i,j)==getr(i,j));
    }
    void solve(void)
    {
        p[0]=1;
	for(int i=1;i<=n;i++){
		h[i]=(h[i-1]*base+s[i]-'a'+1)%mod;
        p[i]=(p[i-1]*base)%mod;
	}
	for(int i=n;i>=1;i--)
	hr[i]=(hr[i+1]*base+s[i]-'a'+1)%mod;
	int ans=0;
	for(int i=1;i<=n;i++){
        int l=0,r=min(n-i,i);
        while(l<=r){
            int mid=(l+r)/2;
            if(check(i-mid+1,i+mid)){
                ans=max(ans,mid*2);
                l=mid+1;
            }
            else
                r=mid-1;
        }
        l=0,r=min(i-1,n-i);
        while(l<=r){
            int mid=(l+r)/2;
            if(check(i-mid,i+mid)){
                ans=max(ans,mid*2+1);
                l=mid+1;
            }
            else
                r=mid-1;
        }
	}
	cout<<ans;
    }
}
namespace sub1
{
    int ans=1,goc;
    int D_odd[maxn],D_even[maxn];
    void Calc_D_odd(string S) {
    int N=S.size();
    S=" "+S;
    int L = 1;
    int R = 0;
    for(int i = 1 ; i <= N ; i++) {
        if(i > R) D_odd[i] = 0;
        else D_odd[i] = min(R - i, D_odd[L + (R - i)]);
        while(i - D_odd[i] - 1 > 0 && i + D_odd[i] + 1 <= N && S[i - D_odd[i] - 1] == S[i + D_odd[i] + 1]) {
            D_odd[i]++;
        }

        if(i + D_odd[i] > R) {
            R = i + D_odd[i];
            L = i - D_odd[i];
        }
    }
}

void Calc_D_even(string S) {
    int N=S.size();
    S=" "+S;
    int L = 1;
    int R = 0;
    for(int i = 1 ; i < N ; i++) {
        int j = i + 1;
        if(j > R) D_even[i] = 0;
        else D_even[i] = min(R - j + 1, D_even[L + (R - j)]);
        while(i - D_even[i] > 0 && j + D_even[i] <= N && S[i - D_even[i]] == S[j + D_even[i]]) {
            D_even[i]++;
        }
        if(i + D_even[i] > R) {
            R = i + D_even[i];
            L = j - D_even[i];
        }
    }
}
    void manacher(string S)
    {
        Calc_D_even(S);
        Calc_D_odd(S);
        int N=S.size();
        for(int i=1;i<N;i++)
        {
            ans=max({ans,D_even[i]*2,D_odd[i]*2+1});
        }
    }
    void dfs(int u,int cha,string tmp)
    {
        tmp+=s[u];
        if(a[u].size()==1&&u!=goc)
            manacher(tmp);
        for(int v:a[u])
        {
            if(v==cha)continue;
            dfs(v,u,tmp);
        }
    }
    void solve(void)
    {
        for(int i=1;i<=n;i++)
        {
            goc=i;
            dfs(i,-1,"");
        }
        cout<<ans;
    }
}
signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    if(fopen(task".inp","r")){
    freopen(task".inp","r",stdin);
    freopen(task".out","w",stdout);}
    cin>>n;
    for(int i=1;i<=n;i++)cin>>s[i];
    for(int i=1;i<n;i++)
    {
        int u,v;
        cin>>u>>v;
        a[u].push_back(v);
        a[v].push_back(u);
    }
    dfs(1,-1);
    if(h[n]==n-1)sub2::solve();
    else sub1::solve();
    cerr <<endl<< "TIME : " << clock() * 0.001 << "s" << endl ;
}

Compilation message (stderr)

lampice.cpp: In function 'int main()':
lampice.cpp:158:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  158 |     freopen(task".inp","r",stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
lampice.cpp:159:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  159 |     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...