社区讨论
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 条回复,欢迎继续交流。
正在加载回复...