社区讨论

60!求hack(玄关)

P5546[POI 2000] 公共串参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mlhvt5pl
此快照首次捕获于
2026/02/11 18:23
上周
此快照最后确认于
2026/02/13 16:00
6 天前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
//#pragma GCC optimize(2)
//#pragma GCC optimize(3,"Ofast","inline")
#define ft first
#define sd second
#define FR1(name,beg,end) for(ll name=beg;name<=end;name++)
#define FR2(name,beg,end) for(ll name=beg;name>=end;name--)

typedef unsigned long long ll;
typedef bool bl;
typedef char cr;
typedef string sig;
//pair
typedef pair<ll,ll> pll;
typedef pair<bl,bl> pbb;
typedef pair<cr,cr> pcc;
typedef pair<pll,ll> pplll;
typedef pair<ll,pll> plpll;
//vector1
typedef vector<ll> vel;
typedef vector<bl> veb;
typedef vector<cr> vec;
typedef vector<sig> ves;
typedef vector<pll> velp;
typedef vector<sig> vels;
typedef vector<pplll> velpp;
typedef vector<pbb> velb;
typedef vector<pcc> vecp;
typedef vector<plpll> veplpll;
//vector2
typedef vector<vel> vevel;
typedef vector<vec> vevec;
typedef vector<velp> vevelp;
typedef vector<veb> veveb;
typedef vector<velpp> vevelpp;
typedef vector<veplpll> veveplpll;
//vector3
typedef vector<vevel> vevevel;
typedef vector<vevec> vevevec;
typedef vector<vevelp> vevevelp;
typedef vector<veveb> veveveb;
typedef vector<vevelpp> vevevelpp;
typedef vector<veveplpll> veveveplpll;
typedef vector<veveb> veveveb;
//
typedef map<ll,ll> mll;
typedef map<cr,ll> mcl;
typedef map<pll,ll> mplll;
typedef map<ll,pll> mlpll;

typedef priority_queue<ll> pql;
typedef priority_queue<ll,vel,greater<ll> > pqlg;
typedef priority_queue<pll> pqpll;
typedef priority_queue<pll,velp,greater<pll>> pqpllg;
typedef priority_queue<plpll> pqplpll;
typedef priority_queue<plpll,veplpll,greater<plpll>> pqplpllg;

typedef vector<pql> vpql;
typedef vector<queue<ll> > vql;
typedef vector<set<ll> > vsl;

const ll IMAX=INT_MAX;
const ll IMIN=INT_MIN;
const ll LMAX=INT64_MAX;
const ll LMIN=INT64_MIN;
const ll mo=998244353;
ll n;
ves v;
vel bs;
vevel hs;
ll ksm(ll x,ll y){
    ll ans=1,tmp=x;
    while(y){
        if(y&1){
            ans*=tmp;
            ans%=mo;
        }
        tmp*=tmp;
        tmp%=mo;
        y/=2;
    }
    return ans;
}
ll gets(ll id,ll l,ll r){
    return ((hs[id][r]-hs[id][l-1])%mo+mo)%mo*ksm(bs[l],mo-2)%mo;
}
bool check(ll x){
    set<ll> st;
    for(int i=1;i+x-1<v[1].size();i++){
        ll l=i,r=i+x-1;
        st.insert(gets(1,l,r));
    }
    for(int i=2;i<=n;i++){
        set<ll> nt;
        for(int l=1;l+x-1<v[i].size();l++){
            ll r=l+x-1;
            ll tmp=gets(i,l,r);
            if(st.find(tmp)!=st.end()){
                nt.insert(tmp);
            }
        }
        st=nt;
    }
    if(st.size()>0)return 1;
    return 0;
}
void slv(){
    cin>>n;
    v=ves(n+3);
    ll minn=2000;
    for(int i=1;i<=n;i++){
        cin>>v[i];
        minn=min(minn,(ll)v[i].size());
        v[i]=' '+v[i];
    }
    bs=vel(2003);
    bs[1]=1;
    for(int i=2;i<=2000;i++){
        bs[i]=bs[i-1]*27%mo;
    }
    hs=vevel(n+3);
    for(int i=1;i<=n;i++){
        hs[i]=vel(v[i].size()+3);
        for(int j=1;j<v[i].size();j++){
            hs[i][j]=hs[i][j-1]+(v[i][j]-'a'+1)*bs[j]%mo;
            hs[i][j]%=mo;
        }
    }
    ll l=1,r=minn,ans=0;
    while(l<=r){
        ll mid=(l+r)/2;
        if(check(mid)){
            ans=mid;
            l=mid+1;
        }else{
            r=mid-1;
        }
    }
    cout<<ans;
}
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    ll T = 1;
//    cin>>T;
    while(T--){
        slv();
    }
}

回复

0 条回复,欢迎继续交流。

正在加载回复...