QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#378902#8571. Palworlducup-team087#AC ✓650ms40376kbC++2020.8kb2024-04-06 15:11:122024-04-06 15:11:12

Judging History

你现在查看的是最新测评结果

  • [2024-04-06 15:11:12]
  • 评测
  • 测评结果:AC
  • 用时:650ms
  • 内存:40376kb
  • [2024-04-06 15:11:12]
  • 提交

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,我给组数据试试?

Details

Tip: Click on the bar to expand more detailed information

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