万紫千红求条玄关
查看原帖
万紫千红求条玄关
1307045
Dark_Knight_AK_ALL楼主2025/7/28 14:49
#include<bits/stdc++.h>
using namespace std;
const int base=1331;
const int mod=5e5+9;
string ans;
char s[510001];
unsigned long long f[510001],bas[510001],f2[510001];
int n;
int cnt;
bool check(int l,int r,int l1,int r1)
{
    return (f[r]-f[l-1]*bas[r-l+1])==(f2[r1]-f2[l1-1]*bas[r1-l1+1]);
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)cin>>s[i];
    bas[0]=1;
    for(int i=1;i<=n;i++)
    {
        f[i]=(f[i-1]*base+s[i])%mod;
        bas[i]=(bas[i-1]*base)%mod;
    }
    for(int i=n;i>=1;i--)
    {
    	f2[i]=(f2[i+1]*base+s[i])%mod;
	}
    int head=1,tail=n;
    for(int i=1;i<=n;i++)
    {
        if(s[head]<s[tail])
            ans[++cnt]=s[head],head++;
        else if(s[tail]<s[head])
            ans[++cnt]=s[tail],tail--;
        else {
        int l=1,r=(tail-head+1)>>1,ans1=1;
        while(l<=r)
        {
            int mid=l+r>>1;
            if(check(head-1,head+mid-1,tail+1,tail-mid+1))
            {
                ans1=mid;
                l=mid+1;
            }
            else r=mid-1;
            //cout<<l<<" "<<r<<endl;
        }
        if(s[head+ans1]<s[tail-ans1])
            ans[++cnt]=s[head],head++;
        else ans[++cnt]=s[tail],tail--;
            }
    }
    for(int i=1;i<=n;i++)
    {
        cout<<ans[i];
        if((i)%80==0)cout<<endl;
    }    
}
2025/7/28 14:49
加载中...