QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#378902 | #8571. Palworld | ucup-team087# | AC ✓ | 650ms | 40376kb | C++20 | 20.8kb | 2024-04-06 15:11:12 | 2024-04-06 15:11:12 |
Judging History
answer
#ifndef LOCAL
#pragma GCC optimize ("Ofast")
#pragma GCC optimize ("unroll-loops")
#endif
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
//#define int ll
bool dbg=false;
#define rng(i,a,b) for(int i=int(a);i<int(b);i++)
#define rep(i,b) rng(i,0,b)
#define gnr(i,a,b) for(int i=int(b)-1;i>=int(a);i--)
#define per(i,b) gnr(i,0,b)
#define pb push_back
#define eb emplace_back
#define a first
#define b second
#define bg begin()
#define ed end()
#define all(x) x.bg,x.ed
#define si(x) int(x.size())
#ifdef LOCAL
#define dmp(x) cerr<<__LINE__<<" "<<#x<<" "<<x<<endl
#else
#define dmp(x) void(0)
#endif
template<class t,class u> bool chmax(t&a,u b){if(a<b){a=b;return true;}else return false;}
template<class t,class u> bool chmin(t&a,u b){if(b<a){a=b;return true;}else return false;}
template<class t> using vc=vector<t>;
template<class t> using vvc=vc<vc<t>>;
using pi=pair<int,int>;
using vi=vc<int>;
using vvi=vc<vc<int>>;
template<class t,class u>
ostream& operator<<(ostream& os,const pair<t,u>& p){
return os<<"{"<<p.a<<","<<p.b<<"}";
}
template<class t> ostream& operator<<(ostream& os,const vc<t>& v){
os<<"{";
for(auto e:v)os<<e<<",";
return os<<"}";
}
#define mp make_pair
#define mt make_tuple
#define one(x) memset(x,-1,sizeof(x))
#define zero(x) memset(x,0,sizeof(x))
#ifdef LOCAL
void dmpr(ostream&os){os<<endl;}
template<class T,class... Args>
void dmpr(ostream&os,const T&t,const Args&... args){
os<<t<<" ";
dmpr(os,args...);
}
#define dmp2(...) dmpr(cerr,__LINE__,##__VA_ARGS__)
#else
#define dmp2(...) void(0)
#endif
using uint=unsigned;
using ull=unsigned long long;
template<class t,size_t n>
ostream& operator<<(ostream&os,const array<t,n>&a){
return os<<vc<t>(all(a));
}
ll rand_int(ll l, ll r) { //[l, r]
//#ifdef LOCAL
static mt19937_64 gen;
/*#else
static mt19937_64 gen(chrono::steady_clock::now().time_since_epoch().count());
#endif*/
return uniform_int_distribution<ll>(l, r)(gen);
}
ll rand_int(ll k){ //[0,k)
return rand_int(0,k-1);
}
string rand_string(int n,char lw,char up){
string s(n,'?');
rep(i,n)s[i]=rand_int(lw,up);
return s;
}
int current_run_id,run_batch_size=1000;
int calc_random_limit(){
return current_run_id/run_batch_size+1;
}
template<class t>
void generate_single(t&a){
a=rand_int(1,calc_random_limit());
}
void generate_single(string&a){
int n;generate_single(n);
a=rand_string(n,'a','b');
}
template<class t,class u>
void generate_single(pair<t,u>&a){
generate_single(a.a);
generate_single(a.b);
}
//https://trap.jp/post/1224/
template<class... Args>
void input(Args&... a){
if(dbg){
(generate_single(a),...);
}else{
(cin >> ... >> a);
}
}
#define INT(...) int __VA_ARGS__;input(__VA_ARGS__)
#define LL(...) ll __VA_ARGS__;input(__VA_ARGS__)
#define ULL(...) ull __VA_ARGS__;input(__VA_ARGS__)
#define STR(...) string __VA_ARGS__;input(__VA_ARGS__)
#define CHR(...) char __VA_ARGS__;input(__VA_ARGS__)
#define DBL(...) double __VA_ARGS__;input(__VA_ARGS__)
#define LD(...) ld __VA_ARGS__;input(__VA_ARGS__)
#define overload3(a,b,c,d,...) d
#define VI2(name,size) vi name(size);rep(i_##name,size)input(name[i_##name]);
#define VI3(name,size,offset) vi name(size);rep(i_##name,size)input(name[i_##name]),name[i_##name]+=offset;
#define VI(...) overload3(__VA_ARGS__,VI3,VI2)(__VA_ARGS__)
#define VPI(name,size) vc<pi> name(size);rep(i_##name,size)input(name[i_##name]);
#define VVI(name,sizeN,sizeM) vvi name(sizeN,vi(sizeM));\
rep(i_##name,sizeN)rep(j_##name,sizeM)input(name[i_##name][j_##name]);
#define VVT(type,name,sizeN,sizeM) vvc<type> name(sizeN,vc<type>(sizeM));
template<int i,class T>
void print_tuple(ostream&,const T&){
}
template<int i,class T,class H,class ...Args>
void print_tuple(ostream&os,const T&t){
if(i)os<<",";
os<<get<i>(t);
print_tuple<i+1,T,Args...>(os,t);
}
template<class ...Args>
ostream& operator<<(ostream&os,const tuple<Args...>&t){
os<<"{";
print_tuple<0,tuple<Args...>,Args...>(os,t);
return os<<"}";
}
ll read(){
ll i;
cin>>i;
return i;
}
vi readvi(int n,int off=0){
vi v(n);
rep(i,n)v[i]=read()+off;
return v;
}
pi readpi(int off=0){
int a,b;cin>>a>>b;
return pi(a+off,b+off);
}
template<class t>
void print_single(t x,int suc=1){
cout<<x;
if(suc==1){
if(dbg)cout<<endl;
else cout<<"\n";
}
if(suc==2)
cout<<" ";
}
template<class t,class u>
void print_single(const pair<t,u>&p,int suc=1){
print_single(p.a,2);
print_single(p.b,suc);
}
template<class T>
void print_single(const vector<T>&v,int suc=1){
rep(i,v.size())
print_single(v[i],i==int(v.size())-1?suc:2);
}
template<class T>
void print_offset(const vector<T>&v,ll off,int suc=1){
rep(i,v.size())
print_single(v[i]+off,i==int(v.size())-1?suc:2);
}
template<class T,size_t N>
void print_single(const array<T,N>&v,int suc=1){
rep(i,N)
print_single(v[i],i==int(N)-1?suc:2);
}
template<class T>
void print(const T&t){
print_single(t);
}
template<class T,class ...Args>
void print(const T&t,const Args&...args){
print_single(t,2);
print(args...);
}
template<class T>
void printvv(const vvc<T>&vs){
for(const auto&row:vs)print(row);
}
string readString(){
string s;
cin>>s;
return s;
}
template<class T>
T sq(const T& t){
return t*t;
}
void YES(bool ex=true){
cout<<"YES\n";
if(ex)exit(0);
#ifdef LOCAL
cout.flush();
#endif
}
void NO(bool ex=true){
cout<<"NO\n";
if(ex)exit(0);
#ifdef LOCAL
cout.flush();
#endif
}
void Yes(bool ex=true){
cout<<"Yes\n";
if(ex)exit(0);
#ifdef LOCAL
cout.flush();
#endif
}
void No(bool ex=true){
cout<<"No\n";
if(ex)exit(0);
#ifdef LOCAL
cout.flush();
#endif
}
//#define CAPITAL
/*
void yes(bool ex=true){
#ifdef CAPITAL
cout<<"YES"<<"\n";
#else
cout<<"Yes"<<"\n";
#endif
if(ex)exit(0);
#ifdef LOCAL
cout.flush();
#endif
}
void no(bool ex=true){
#ifdef CAPITAL
cout<<"NO"<<"\n";
#else
cout<<"No"<<"\n";
#endif
if(ex)exit(0);
#ifdef LOCAL
cout.flush();
#endif
}*/
void possible(bool ex=true){
#ifdef CAPITAL
cout<<"POSSIBLE"<<"\n";
#else
cout<<"Possible"<<"\n";
#endif
if(ex)exit(0);
#ifdef LOCAL
cout.flush();
#endif
}
void impossible(bool ex=true){
#ifdef CAPITAL
cout<<"IMPOSSIBLE"<<"\n";
#else
cout<<"Impossible"<<"\n";
#endif
if(ex)exit(0);
#ifdef LOCAL
cout.flush();
#endif
}
constexpr ll ten(int n){
return n==0?1:ten(n-1)*10;
}
const ll infLL=LLONG_MAX/3;
#ifdef int
const int inf=infLL;
#else
const int inf=INT_MAX/2-100;
#endif
int topbit(signed t){
return t==0?-1:31-__builtin_clz(t);
}
int topbit(ll t){
return t==0?-1:63-__builtin_clzll(t);
}
int topbit(ull t){
return t==0?-1:63-__builtin_clzll(t);
}
int botbit(signed a){
return a==0?32:__builtin_ctz(a);
}
int botbit(ll a){
return a==0?64:__builtin_ctzll(a);
}
int botbit(ull a){
return a==0?64:__builtin_ctzll(a);
}
int popcount(signed t){
return __builtin_popcount(t);
}
int popcount(ll t){
return __builtin_popcountll(t);
}
int popcount(ull t){
return __builtin_popcountll(t);
}
int bitparity(ll t){
return __builtin_parityll(t);
}
bool ispow2(int i){
return i&&(i&-i)==i;
}
ll mask(int i){
return (ll(1)<<i)-1;
}
ull umask(int i){
return (ull(1)<<i)-1;
}
ll minp2(ll n){
if(n<=1)return 1;
else return ll(1)<<(topbit(n-1)+1);
}
bool inc(int a,int b,int c){
return a<=b&&b<=c;
}
template<class S> void mkuni(S&v){
sort(all(v));
v.erase(unique(all(v)),v.ed);
}
template<class t> bool isuni(vc<t> v){
int s=si(v);
mkuni(v);
return si(v)==s;
}
template<class t>
void myshuffle(vc<t>&a){
rep(i,si(a))swap(a[i],a[rand_int(0,i)]);
}
template<class S,class u>
int lwb(const S&v,const u&a){
return lower_bound(all(v),a)-v.bg;
}
template<class t,class u>
bool bis(const vc<t>&v,const u&a){
return binary_search(all(v),a);
}
//VERIFY: yosupo
//KUPC2017J
//AOJDSL1A
//without rank
struct unionfind{
vi p,s;
int c;
unionfind(int n):p(n,-1),s(n,1),c(n){}
void clear(){
fill(all(p),-1);
fill(all(s),1);
c=si(p);
}
int find(int a){
return p[a]==-1?a:(p[a]=find(p[a]));
}
//set b to a child of a
bool unite(int a,int b){
a=find(a);
b=find(b);
if(a==b)return false;
p[b]=a;
s[a]+=s[b];
c--;
return true;
}
bool same(int a,int b){
return find(a)==find(b);
}
int sz(int a){
return s[find(a)];
}
};
vvc<int> readGraph(int n,int m){
vvc<int> g(n);
rep(i,m){
int a,b;
cin>>a>>b;
//sc.read(a,b);
a--;b--;
g[a].pb(b);
g[b].pb(a);
}
return g;
}
vvc<int> readTree(int n){
if(dbg){
vvc<int> t(n);
unionfind uf(n);
while(uf.c>1){
int a=rand_int(n);
int b=rand_int(n);
if(uf.unite(a,b)){
t[a].pb(b);
t[b].pb(a);
}
}
return t;
}else{
return readGraph(n,n-1);
}
}
void printTree(const vvc<int> t){
int n=si(t);
int degsum=0;
rep(i,n)degsum+=si(t[i]);
if(degsum==n-1){
//directed
rep(i,si(t))for(auto j:t[i]){
print(i+1,j+1);
}
}else if(degsum==2*(n-1)){
//undirected
rep(i,si(t))for(auto j:t[i])if(i<j){
print(i+1,j+1);
}
}else{
assert(false);
}
}
template<class t>
vc<t> presum(const vc<t>&a){
vc<t> s(si(a)+1);
rep(i,si(a))s[i+1]=s[i]+a[i];
return s;
}
vc<ll> presum(const vi&a){
vc<ll> s(si(a)+1);
rep(i,si(a))s[i+1]=s[i]+a[i];
return s;
}
//BIT で数列を管理するときに使う (CF850C)
template<class t>
vc<t> predif(vc<t> a){
gnr(i,1,si(a))a[i]-=a[i-1];
return a;
}
template<class t>
vvc<ll> imos(const vvc<t>&a){
int n=si(a),m=si(a[0]);
vvc<ll> b(n+1,vc<ll>(m+1));
rep(i,n)rep(j,m)
b[i+1][j+1]=b[i+1][j]+b[i][j+1]-b[i][j]+a[i][j];
return b;
}
//verify してないや
void transvvc(int&n,int&m){
swap(n,m);
}
template<class t,class... Args>
void transvvc(int&n,int&m,vvc<t>&a,Args&...args){
assert(si(a)==n);
vvc<t> b(m,vi(n));
rep(i,n){
assert(si(a[i])==m);
rep(j,m)b[j][i]=a[i][j];
}
a.swap(b);
transvvc(n,m,args...);
}
//CF854E
void rotvvc(int&n,int&m){
swap(n,m);
}
template<class t,class... Args>
void rotvvc(int&n,int&m,vvc<t>&a,Args&...args){
assert(si(a)==n);
vvc<t> b(m,vi(n));
rep(i,n){
assert(si(a[i])==m);
rep(j,m)b[m-1-j][i]=a[i][j];
}
a.swap(b);
rotvvc(n,m,args...);
}
//ソートして i 番目が idx[i]
//CF850C
template<class t>
vi sortidx(const vc<t>&a){
int n=si(a);
vi idx(n);iota(all(idx),0);
sort(all(idx),[&](int i,int j){return a[i]<a[j];});
return idx;
}
//vs[i]=a[idx[i]]
//例えば sortidx で得た idx を使えば単にソート列になって返ってくる
//CF850C
template<class t>
vc<t> a_idx(const vc<t>&a,const vi&idx){
int n=si(a);
assert(si(idx)==n);
vc<t> vs(n);
rep(i,n)vs[i]=a[idx[i]];
return vs;
}
//CF850C
vi invperm(const vi&p){
int n=si(p);
vi q(n);
rep(i,n)q[p[i]]=i;
return q;
}
template<class t,class s=t>
s SUM(const vc<t>&a){
return accumulate(all(a),s(0));
}
template<class t,size_t K,class s=t>
s SUM(const array<t,K>&a){
return accumulate(all(a),s(0));
}
template<class t>
t MAX(const vc<t>&a){
return *max_element(all(a));
}
template<class t>
pair<t,int> MAXi(const vc<t>&a){
auto itr=max_element(all(a));
return mp(*itr,itr-a.bg);
}
template<class A>
auto MIN(const A&a){
return *min_element(all(a));
}
template<class t>
pair<t,int> MINi(const vc<t>&a){
auto itr=min_element(all(a));
return mp(*itr,itr-a.bg);
}
vi vid(int n){
vi res(n);iota(all(res),0);
return res;
}
template<class S>
void soin(S&s){
sort(all(s));
}
template<class S,class F>
void soin(S&s,F&&f){
sort(all(s),forward<F>(f));
}
template<class S>
S soout(S s){
soin(s);
return s;
}
template<class S>
void rein(S&s){
reverse(all(s));
}
template<class S>
S reout(S s){
rein(s);
return s;
}
template<class t,class u>
pair<t,u>&operator+=(pair<t,u>&a,pair<t,u> b){
a.a+=b.a;a.b+=b.b;return a;}
template<class t,class u>
pair<t,u>&operator-=(pair<t,u>&a,pair<t,u> b){
a.a-=b.a;a.b-=b.b;return a;}
template<class t,class u>
pair<t,u> operator+(pair<t,u> a,pair<t,u> b){return mp(a.a+b.a,a.b+b.b);}
template<class t,class u>
pair<t,u> operator-(pair<t,u> a,pair<t,u> b){return mp(a.a-b.a,a.b-b.b);}
template<class t,class u,class v>
pair<t,u>&operator*=(pair<t,u>&a,v b){
a.a*=b;a.b*=b;return a;}
template<class t,class u,class v>
pair<t,u> operator*(pair<t,u> a,v b){return a*=b;}
template<class t,class u>
pair<t,u> operator-(pair<t,u> a){return mp(-a.a,-a.b);}
namespace std{
template<class t,class u>
istream&operator>>(istream&is,pair<t,u>&a){
return is>>a.a>>a.b;
}
}
template<class t>
t gpp(vc<t>&vs){
assert(si(vs));
t res=move(vs.back());
vs.pop_back();
return res;
}
template<class t,class u>
void pb(vc<t>&a,const vc<u>&b){
a.insert(a.ed,all(b));
}
template<class t,class...Args>
vc<t> cat(vc<t> a,Args&&...b){
(pb(a,forward<Args>(b)),...);
return a;
}
template<class t,class u>
vc<t>& operator+=(vc<t>&a,u x){
for(auto&v:a)v+=x;
return a;
}
template<class t,class u>
vc<t> operator+(vc<t> a,u x){
return a+=x;
}
template<class t>
vc<t> operator+(const vc<t>&a,const vc<t>&b){
vc<t> c(max(si(a),si(b)));
rep(i,si(a))c[i]+=a[i];
rep(i,si(b))c[i]+=b[i];
return c;
}
template<class t,class u>
vc<t>& operator-=(vc<t>&a,u x){
for(auto&v:a)v-=x;
return a;
}
template<class t,class u>
vc<t>& operator-(vc<t> a,u x){
return a-=x;
}
template<class t,class u>
vc<t>& operator*=(vc<t>&a,u x){
for(auto&v:a)v*=x;
return a;
}
template<class t,class u>
vc<t>& operator*(vc<t> a,u x){
return a*=x;
}
template<class t,class u>
void remval(vc<t>&a,const u&v){
a.erase(remove(all(a),v),a.ed);
}
//消した要素の個数を返してくれる
//UCUP 2-8-F
template<class t,class F>
int remif(vc<t>&a,F f){
auto itr=remove_if(all(a),f);
int res=a.ed-itr;
a.erase(itr,a.ed);
return res;
}
template<class VS,class u>
void fila(VS&vs,const u&a){
fill(all(vs),a);
}
template<class t,class u>
int findid(const vc<t>&vs,const u&a){
auto itr=find(all(vs),a);
if(itr==vs.ed)return -1;
else return itr-vs.bg;
}
template<class t>
void rtt(vc<t>&vs,int i){
rotate(vs.bg,vs.bg+i,vs.ed);
}
//Multiuni2023-8 C
//f(lw)=false,...,f(n-1)=false,f(n)=true,...,f(up)=true,
//のときに n を返す
template<class F>
int find_min_true(int lw,int up,F f){
while(up-lw>1){
const int mid=(lw+up)/2;
if(f(mid))up=mid;
else lw=mid;
}
return up;
}
//f(lw)=true,f(up)=false
template<class F>
int find_max_true(int lw,int up,F f){
while(up-lw>1){
const int mid=(lw+up)/2;
if(f(mid))lw=mid;
else up=mid;
}
return lw;
}
template<class t> using pqmin=priority_queue<t,vc<t>,greater<t>>;
template<class t> using pqmax=priority_queue<t>;
using T=tuple<int,int,int>;
//VERIFY: yosupo
//AOJGRL5C
template<class t,class u>
struct sparsetable{
vvc<t> a;
u f;
const t id;
sparsetable(const vc<t>& d,u ff,t w):f(ff),id(w){
if(d.empty())return;
int n=d.size(),h=topbit(n);
a.resize(h+1);
a[0]=d;
rng(j,1,h+1){
a[j].resize(n-(1<<j)+1);
rep(i,n-(1<<j)+1)
a[j][i]=f(a[j-1][i],a[j-1][i+(1<<(j-1))]);
}
}
t get(int b,int e){
assert(b<=e);
if(b==e)return id;
int d=topbit(e-b);
return f(a[d][b],a[d][e-(1<<d)]);
}
};
const auto imin=[](int a,int b){
return min(a,b);
};
using minst=sparsetable<int,decltype(imin)>;
const auto imax=[](int a,int b){
return max(a,b);
};
using maxst=sparsetable<int,decltype(imax)>;
//O(N+max(A)) なので座標圧縮してから動かしてください
//Verify yosupo (N=500000,string,43ms)
template<class t>vi sais(t a){
int n=si(a),m=*max_element(all(a))+1;
vi pos(m+1),x(m),sa(n),val(n),lms;
for(auto c:a)pos[c+1]++;
rep(i,m)pos[i+1]+=pos[i];
vc<bool> s(n);
per(i,n-1)s[i]=a[i]!=a[i+1]?a[i]<a[i+1]:s[i+1];
auto ind=[&](const vi&ls){
fill(all(sa),-1);
auto L=[&](int i){if(i>=0&&!s[i])sa[x[a[i]]++]=i;};
auto S=[&](int i){if(i>=0&& s[i])sa[--x[a[i]]]=i;};
rep(i,m)x[i]=pos[i+1];
per(i,si(ls))S(ls[i]);
rep(i,m)x[i]=pos[i];
L(n-1);
rep(i,n)L(sa[i]-1);
rep(i,m)x[i]=pos[i+1];
per(i,n)S(sa[i]-1);
};
auto ok=[&](int i){return i==n||(!s[i-1]&&s[i]);};
auto same=[&](int i,int j){
do{
if(a[i++]!=a[j++])return false;
}while(!ok(i)&&!ok(j));
return ok(i)&&ok(j);
};
rng(i,1,n)if(ok(i))lms.pb(i);
ind(lms);
if(si(lms)){
int p=-1,w=0;
for(auto v:sa)if(v&&ok(v)){
if(p!=-1&&same(p,v))w--;
val[p=v]=w++;
}
vi b=lms;
for(auto&v:b)v=val[v];
b=sais(b);
for(auto&v:b)v=lms[v];
ind(b);
}
return sa;
}
struct SA{
int n;
vi sa,as,lcp;
template<class t> SA(t s):n(si(s)),as(n),lcp(n-1){
{//座標圧縮,値域が小さいなら skip 可
auto vs=s;mkuni(vs);
for(auto&v:s)v=lwb(vs,v);
}
sa=sais(s);
//as
rep(i,n)as[sa[i]]=i;
//lcp
int w=0;
for(auto i:as){
if(w)w--;
if(i<n-1){
while(max(sa[i],sa[i+1])+w<n&&s[sa[i]+w]==s[sa[i+1]+w]) w++;
lcp[i]=w;
}
}
}
};
//Xmas2012B
template<class S>
struct string_cmp{
S s;
int n;
SA sa;
minst t;
string_cmp(const S&ss):s(ss),n(si(s)),sa(s),t(sa.lcp,imin,inf){}
int getlcp(int i,int j){
if(i==n||j==n)return 0;
if(i==j)return n-i;
i=sa.as[i];
j=sa.as[j];
if(i>j)swap(i,j);
return t.get(i,j);
}
int cmpchar(int i,int j){
assert(0<=i&&i<n);
assert(0<=j&&j<n);
assert(s[i]!=s[j]);
return s[i]<s[j]?-1:1;
}
//[a,b)<[c,d)-> -1
//same -> 0
//[a,b)>[c,d) -> 1
int cmp(int a,int b,int c,int d){
int len=min({getlcp(a,c),b-a,d-c});
if(a+len==b&&c+len==d)return 0;
if(a+len==b)return -1;
if(c+len==d)return 1;
return cmpchar(a+len,c+len);
}
//ABC240H
int cmp(pi a,pi b){
return cmp(a.a,a.b,b.a,b.b);
}
int cmp_samelen(int a,int b,int len){
return cmp(a,a+len,b,b+len);
}
//[l,r) のリストを受け取り,それらを連結してできる文字列の比較をする
//リストの長さ 2 の場合は verify (Xmas2012 B)
int cmp_list(vc<pi> a,vc<pi> b){
int i=0,j=0;
while(1){
while(i<si(a)&&a[i].a==a[i].b)i++;
while(j<si(b)&&b[j].a==b[j].b)j++;
if(i==si(a)&&j==si(b))return 0;
if(i==si(a))return -1;
if(j==si(b))return 1;
int k=min(a[i].b-a[i].a,b[j].b-b[j].a);
int x=cmp_samelen(a[i].a,b[j].a,k);
if(x)return x;
a[i].a+=k;
b[j].a+=k;
}
assert(0);
}
//[l,r) のリストを受け取り,それらを連結してできる文字列の LCP を求める
//UCUP 2-17-H
int lcp_list(vc<pi> a,vc<pi> b){
int i=0,j=0,res=0;
while(1){
while(i<si(a)&&a[i].a==a[i].b)i++;
while(j<si(b)&&b[j].a==b[j].b)j++;
if(i==si(a)||j==si(b))return res;
int k=min(a[i].b-a[i].a,b[j].b-b[j].a);
int x=getlcp(a[i].a,b[j].a);
if(x<k)return res+x;
res+=k;
a[i].a+=k;
b[j].a+=k;
}
assert(0);
}
//UCUP 2-24-E
//s[i,i+len) = s[j,j+len) が一致するような j の範囲
//範囲というのは SA 上での範囲
//TLE したので segtree で代用 (UCUP 2-24-E)
pi common_range(int i,int len){
assert(inc(0,i,n-1));
i=sa.as[i];
int l=find_min_true(-1,i,[&](int j){
return t.get(j,i)>=len;
});
int r=find_max_true(i,n,[&](int j){
return t.get(i,j)>=len;
})+1;
return pi(l,r);
}
};
//Petrozavodsk 2019w Day9 G
//Petrozavodsk 2020S Day4 G
//aba->121
template<class S>
vi manacher(const S&s){
int n=s.size();
vi v(n);
int j=0;
rep(i,n){
int k=j*2-i;
if(k>=0&&i+v[k]<j+v[j])
v[i]=v[k];
else{
v[i]=j+v[j]-i;
j=i;
while(i+v[i]<n&&i-v[i]>=0&&s[i-v[i]]==s[i+v[i]])
v[i]++;
}
}
return v;
}
template<class S>
vi manacher_even(const S&s,int none){
S t;
t.reserve(si(s)*2+1);
t.pb(none);
for(auto c:s){
t.pb(c);
t.pb(none);
}
vi a=manacher(t),b;
rep(i,si(s)+1)
b.pb(a[i*2]/2);
return b;
}
//UCUP 2-27-G
template<class S>
vi diameter(const S&s,int none){
int n=si(s);
S t;
t.reserve(n*2+1);
t.pb(none);
rep(i,n){
t.pb(s[i]);
t.pb(none);
}
return manacher(t)-1;
}
void slv(){
INT(n,k);
STR(s);
int ans=k+min(n,k+1);
string_cmp sc(s+reout(s));
auto upd=[&](int l,int r,int add){
if(0<=l&&r<=n){
int c=sc.getlcp(r,2*n-l);
chmin(c,l);
chmin(c,n-r);
chmax(ans,r-l+add+c*2);
}
};
vi dia=diameter(s,-1);
dmp(s);
dmp(dia);
rep(i,2*n+1){
int l=i-dia[i];
int r=i+dia[i];
assert(l%2==0);
l/=2;
assert(r%2==0);
r/=2;
rep(add,k+1){
upd(l-add,r,add);
upd(l,r+add,add);
}
}
print(ans);
}
signed main(signed argc,char*argv[]){
if(argc>1&&strcmp(argv[1],"D")==0)dbg=true;
cin.tie(0);
ios::sync_with_stdio(0);
cout<<fixed<<setprecision(20);
if(dbg){
while(1){
if(current_run_id%run_batch_size==0){
cerr<<"Current Run "<<current_run_id<<endl;
}
slv();
current_run_id++;
}
}else{
int t;cin>>t;rep(_,t)
slv();
}
}
这程序好像有点Bug,我给组数据试试?
详细
Test #1:
score: 100
Accepted
time: 1ms
memory: 3596kb
input:
4 1 3 a 4 1 icpc 4 2 icpc 8 4 icecream
output:
4 5 5 11
result:
ok 4 number(s): "4 5 5 11"
Test #2:
score: 0
Accepted
time: 491ms
memory: 40060kb
input:
1 200000 66 jsmwjmibgkjvdscqllsxpaxiycmpauhnzschbivtqbjfrxrqvhvfbqecozjewqqpwdfbeqppjkgxhbnniopkptkygspcdswhwadfwhnzovvpshgcdukrupeztkpxwhmctaquqbxtidzbbxsyuaeikuldaoeudletrsmqptaejibkymsjhmwykqsjdvvdaqwelrcpxwrwhuvodipjniowfofbjktkdezwqqbvwsppsmpilntmdmlxgkaxymnugmmcsljkjzjuudnllydwdwwanadynsoiolso...
output:
141
result:
ok 1 number(s): "141"
Test #3:
score: 0
Accepted
time: 650ms
memory: 39884kb
input:
1 200000 100 qhiaajzxinenucrnfffumuhnovpuwcnojbhsktztapgyivmfqrlntwazwnfetwqieckxcnkskpidltiydfoveaucckximydxxfbiwbdufmbhywqkflyqxbijakadqkzftlciccbpnldsqhtjxuxnvkusvizavuyfhdroiuominebadhfqzrpjnzpgyvkejfwmueiltyeqpvwrkanqknyacqganbszktocfuvvsfrboaennwpaabfdnaurvvurysrijnfaonesihbhrrvbvyhpbremsuhhbc...
output:
209
result:
ok 1 number(s): "209"
Test #4:
score: 0
Accepted
time: 105ms
memory: 3616kb
input:
10000 21 7 fhcjhdjcfbfbdeeheibhg 18 8 hccgjfaadefhjhcijc 15 7 ahefiiheaigjiid 15 3 fgjjebidbfgbdij 15 5 jccebbgjbhifjhb 20 2 hcbddhibgfccjjcfebcc 19 1 ehbdgiicchijebidbcd 20 8 gbcfghefhbjggecdhcbj 17 2 jjaeaccjbcfiehfdd 23 4 iafjedfbebbhcfgfjbehdaf 22 1 jgiiiaacehcbaiehfggcfi 17 2 jefbbfigfhbhfcici ...
output:
17 21 17 11 13 9 6 18 9 11 6 9 22 8 21 23 5 23 7 16 9 23 25 11 17 12 9 5 20 5 23 12 7 13 16 17 21 21 21 12 16 21 21 8 9 11 21 15 5 24 13 7 21 13 11 8 7 19 25 7 8 12 13 22 15 14 7 15 7 20 15 13 11 15 5 11 23 17 17 19 15 7 19 17 25 13 23 10 17 21 9 21 7 23 21 13 16 7 14 10 13 10 9 11 7 21 15 19 11 23 ...
result:
ok 10000 numbers
Test #5:
score: 0
Accepted
time: 130ms
memory: 40084kb
input:
1 200000 100 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...
output:
200100
result:
ok 1 number(s): "200100"
Test #6:
score: 0
Accepted
time: 490ms
memory: 40376kb
input:
1 200000 73 jgqahsycxmrrwvszqigkxmxxckratkgiyyqbxgjzaqkufvkgmepixhjdugpsntlsgtiedueukiytrytrcvlkymwibsfdhytbffmtaytnfczbavrrbdnpegwxubyeoopzopqhrwukohojtaizsureefffglwjfawvpqqnjteveuscyelgjiukskvymqejzwlnrjgvnpwnttzahoupruedryqeyahxgltnibxhbpxmhxxnmrebsgbjwsfpipezkekaqptnwtuanbfyfwyotwkrvlamnuvhunty...
output:
175682
result:
ok 1 number(s): "175682"
Test #7:
score: 0
Accepted
time: 61ms
memory: 3656kb
input:
10000 12 1 jelwdrimpvtq 19 8 qcogumialfqhaahfhtb 11 12 tbnfsiqbibv 5 4 hdehb 4 1 ivxi 7 8 nonrwqa 14 16 obvpfqjekvmnyq 4 5 fzhi 18 17 gploorpjnrrhcrgxlp 2 3 pf 7 9 uiliuyr 1 3 v 3 3 bgj 9 4 tektrwtmk 10 4 vvkvbzpbye 20 5 jqzqpqiwkssksbilayvj 2 4 kl 5 2 vptsk 20 9 kuiwsxhfmirnrhzuysqd 8 8 aairrgjl 15...
output:
3 20 23 9 5 15 30 9 35 5 16 4 6 11 11 14 6 5 21 16 13 11 2 23 13 3 30 5 23 15 21 16 18 21 3 3 11 23 13 13 8 14 4 22 6 5 13 3 18 27 9 3 24 32 28 3 13 3 31 18 3 7 8 3 15 20 7 13 19 15 3 7 3 15 12 4 7 29 5 3 11 36 23 5 26 22 11 8 12 30 7 9 25 11 3 3 9 12 15 22 10 2 17 15 21 7 31 33 7 35 18 31 11 10 10 ...
result:
ok 10000 numbers
Test #8:
score: 0
Accepted
time: 59ms
memory: 3608kb
input:
20480 1 1 d 1 2 d 1 1 z 1 2 z 2 1 pp 2 2 pp 2 3 pp 2 1 zp 2 2 zp 2 3 zp 2 1 pz 2 2 pz 2 3 pz 2 1 zz 2 2 zz 2 3 zz 3 1 www 3 2 www 3 3 www 3 4 www 3 1 mww 3 2 mww 3 3 mww 3 4 mww 3 1 wmw 3 2 wmw 3 3 wmw 3 4 wmw 3 1 mmw 3 2 mmw 3 3 mmw 3 4 mmw 3 1 wwm 3 2 wwm 3 3 wwm 3 4 wwm 3 1 mwm 3 2 mwm 3 3 mwm 3 ...
output:
2 3 2 3 3 4 5 3 4 5 3 4 5 3 4 5 4 5 6 7 4 5 6 7 4 5 6 7 4 5 6 7 4 5 6 7 4 5 6 7 4 5 6 7 4 5 6 7 5 6 7 8 9 5 6 7 8 9 5 6 7 8 9 4 6 7 8 9 5 6 7 8 9 5 5 7 8 9 5 6 7 8 9 5 6 7 8 9 5 6 7 8 9 5 6 7 8 9 5 5 7 8 9 5 6 7 8 9 4 6 7 8 9 5 6 7 8 9 5 6 7 8 9 5 6 7 8 9 6 7 8 9 10 11 6 7 8 9 10 11 6 7 8 9 10 11 5 ...
result:
ok 20480 numbers
Test #9:
score: 0
Accepted
time: 224ms
memory: 3724kb
input:
2000 88 14 hbwgbmjtqmgdpbgsdkjndhwjrhluountepcjpecnaogiamrzmnomjcgzzvdrzsfjspyxpooxhjtzlqtzvpeydwap 104 88 osirzoiablktpnobqvhckmttlpbgaeakzhemoxgteqbkmfzaerhqfwkoqpsiqqymmbmufxhvfhovkhdduzybzzhqnvbmswqepkqzrkox 82 25 rumtzeygumtvcmyiowwmxkjekajxpubgazyxabibdirnbsmzsjawtaksrydmuroohkrrajlqqyxogtvuul...
output:
31 177 53 71 113 9 153 107 97 51 149 153 121 193 111 38 129 175 99 183 91 183 115 182 203 41 193 155 159 11 149 145 111 19 76 152 67 107 79 15 49 175 149 63 115 59 45 39 138 37 102 14 23 157 75 175 31 33 65 95 171 61 59 34 73 107 195 185 113 11 65 16 128 184 59 139 23 131 115 135 143 166 42 34 49 29...
result:
ok 2000 numbers
Test #10:
score: 0
Accepted
time: 634ms
memory: 39940kb
input:
1 200000 100 cbdadabcbdaaacbedaccdeeeaabececdbcdebcedaeacddcdeaacaccedeadecacaabbdbdbbbbbeaecddbcaaeeaddcabcbebecebcddeccaeceacdebecaddcaddaaadaecabcbbbababedbbccbaceadaeccbbceaeacdccaaaabcbdaebcbcacaaeebebdddeeeeddcaaadbbbccacecacccebeeaabaecbdeccccbdbeedcddececabeaadeaadadcccbeebaecbacbccdbaceebdb...
output:
222
result:
ok 1 number(s): "222"
Test #11:
score: 0
Accepted
time: 649ms
memory: 39924kb
input:
1 200000 100 bcacdaadcdbcaeeebacabdaadebbceabaacdebddeacdebaabdccacdcacadbceceecdccebdebdbccdadbebbaebcabeddeabbdebdadcdedaadedbccbbdbcccdceddeadccdaadeecbebddcddccccbebccbbadaaadeeabaedecdacbeaabadcdeaeddadecdeddbeedeccaabaeebebdbecceaecbdcebceaadeebeaaceadebedcbdbdbcdbbecabddecabcdbccbbbecdaceabdd...
output:
220
result:
ok 1 number(s): "220"
Extra Test:
score: 0
Extra Test Passed