QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#379808#8571. Palworlducup-team1447#AC ✓3397ms146376kbC++234.9kb2024-04-06 19:15:002024-04-06 19:15:00

Judging History

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

  • [2024-04-06 19:15:00]
  • 评测
  • 测评结果:AC
  • 用时:3397ms
  • 内存:146376kb
  • [2024-04-06 19:15:00]
  • 提交

answer

#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
#include <assert.h>
#include <math.h>
#include <set>
#include <vector>
using std::min;
#define od(x) printf("%lld",x)
#define odb(x) printf("%lld ",x)
#define odl(x) printf("%lld\n",x)
#define odp(x,y) printf("%lld %lld\n",x,y)
using pi=std::pair<int,int>;
using vi=std::vector<int>;
using vpi=std::vector<pi>;
const int mod=998244353;
#define x first
#define y second
int max(int x,int y){return x>y?x:y;}
int min(int x,int y){return x<y?x:y;}
inline int read()
{
	int num=0,f=1;char c=getchar();
	while(c<48||c>57){if(c=='-')f=-1;c=getchar();}
	while(c>47&&c<58)num=num*10+(c^48),c=getchar();
	return num*f;
}
void mae(int &x,int y){x=x+y;if(x>=mod)x-=mod;}
int me(int x,int y){return x*y%mod;}
void mxe(int &a,int b){if(a<b)a=b;}
int sa[1234567],rk[1234567];
pi tmp[1234567],vv[1234567];
int sz[1234567],tk[1234567],od[1234567],pk[1234567],height[1234567];
char a[1234567];
vpi g[1234567];
void SA(char *t,int n)
{
	for(int i=1;i<=max(n*2,1000);i++)
		sa[i]=rk[i]=tmp[i].first=tmp[i].second=vv[i].first=vv[i].second
		=sz[i]=tk[i]=od[i]=pk[i]=height[i]=0;
	for(int i=1;i<=n;i++)t[i]-=96;
	memset(rk,0,sizeof(rk));
	for(int i=1;i<=n;i++)rk[i]=t[i];
	int Q=std::max(n,200);
	for(int j=1;j<=n;j<<=1)
	{
		//sort by 2k
		for(int i=0;i<=Q;i++)sz[i]=0;
		for(int i=1;i<=n;i++)sz[rk[j+i]+1]++;
		for(int i=1;i<=Q;i++)sz[i]+=sz[i-1];
		for(int i=1;i<=n;i++)tk[++sz[rk[j+i]]]=i;
		//sort by 1k
		for(int i=0;i<=Q;i++)sz[i]=0;
		for(int i=1;i<=n;i++)sz[rk[i]+1]++;
		for(int i=1;i<=Q;i++)sz[i]+=sz[i-1];
		for(int i=1;i<=n;i++)od[++sz[rk[tk[i]]]]=tk[i];
		for(int i=1;i<=n;i++)
		{
			int x=od[i],y=od[i-1];
			if(i==1||rk[x]!=rk[y]||rk[x+j]!=rk[y+j])pk[i]=1;
			else pk[i]=0;
		}
		for(int i=1;i<=n;i++)rk[od[i]]=rk[od[i-1]]+pk[i];
	}
	for(int i=1;i<=n;i++)sa[rk[i]]=i;
	for(int i=0,k=0;i<n;i++)
	{
		if(rk[i]==0)continue;
		if(k)k--;
		int j=sa[rk[i]-1];
		while(j+k<=n&&i+k<=n&&t[i+k]==t[j+k])k++;
		height[rk[i]]=k;
		if(i&&j)g[k].push_back({i,j});
	}
}
#define sz szsz
#define mgs int fa[1<<22],sz[1<<22];\
inline int f(int x){return x==fa[x]?x:fa[x]=f(fa[x]);}\
inline int uf(int x,int y)\
{\
    int fx=f(x),fy=f(y);\
    if(fx==fy)return 0;\
    if(sz[fx]>sz[fy])fx^=fy^=fx^=fy;\
    fa[fx]=fy,sz[fy]+=sz[fx];\
    return 1;\
}

mgs
struct STmin{
	int a[21][1000005],n;
	void build(int N,int *b)
	{
		n=N;
		for(int i=1;i<=n;i++)a[0][i]=b[i];
		for(int i=1;i<=20;i++)
			for(int j=1;j<=n-(1<<i)+1;j++)
				a[i][j]=min(a[i-1][j],a[i-1][j+(1<<i-1)]);
	}
	int q(int l,int r)
	{
		int d=std::__lg(r-l+1);
		return min(a[d][l],a[d][r-(1<<d)+1]);
	}
};
STmin st;

int lcp(int l,int r)
{
	if(l==r)return 1145141;
	l=rk[l],r=rk[r];
	if(l>r)std::swap(l,r);
	return st.q(l+1,r);
}
int n,k;
int get(int x,int y){
	if(x<1||x>n||y<1||y>n)return 0;
	int mx=min(n-x+1,y);
	return min(lcp(x,2*n+1-y),mx);
}
int L[400005][2],R[400005][2];
signed main()
{
	int T=read();while(T--){
	
		n=read(),k=read();
		scanf("%s",a+1);
		for(int i=1;i<=n;i++)a[n+n+1-i]=a[i];
		// puts(a+1);
		SA(a,n+n);
		st.build(n+n,height);
		// for(int i=1;i<=n;i++,puts(""))
			// for(int j=1;j<=n;j++)
				// printf("%d ",i==j?0:lcp(i,j));
		// printf("lcp=%d\n",lcp(3,6));
		// for(int i=1;i<=n*2;i++)printf("%d ",rk[i]);puts("");
		// for(int i=1;i<=n*2;i++)printf("%d ",height[i]);puts("");
		for(int i=2;i<=2*n;i++)
			for(int j=0;j<=1;j++)
			{
				if(i%2==0)L[i][j]=R[i][j]=i/2;
				else L[i][j]=i/2+1,R[i][j]=i/2;
			}
		int res=0;
		for(int j=0;j<=0;j++)
			for(int i=2;i<=n*2;i++)
			{
				int len=get(R[i][j]+1,L[i][j]-1);
				L[i][j]-=len,R[i][j]+=len;
				// printf("%d %d : [%d %d]\n",i,j,L[i][j],R[i][j]);
				int _=i;
				if(j==0)
				{
					for(int z=1;z<=k;z++)
					{
						int l=L[i][j],r=R[i][j]+z;
						if(r<=n)
						{
							res=max(res,r-l+1+z+2*get(r+1,l-1));
							// if(r-l+1+i+get(r+1,l-1)==13)
							// {
								// printf("_,i=%d %d l,r=%d %d\n",_,i,l,r);
							// }
							// L[l+r][j+1]=min(L[l+r][j+1],l);
							// R[l+r][j+1]=max(R[l+r][j+1],r);
						}
						l=L[i][j]-z,r=R[i][j];
						if(l>=1)
						{
							res=max(res,r-l+1+z+2*get(r+1,l-1));
							// L[l+r][j+1]=min(L[l+r][j+1],l);
							// R[l+r][j+1]=max(R[l+r][j+1],r);
						}
					}
				}
				// if(R[i][j]!=n)
				// {
					// int l=L[i][j],r=R[i][j]+1;
					// L[l+r][j+1]=min(L[l+r][j+1],l);
					// R[l+r][j+1]=max(R[l+r][j+1],r);
				// }
				// if(L[i][j]!=1)
				// {
					// int l=L[i][j]-1,r=R[i][j];
					// L[l+r][j+1]=min(L[l+r][j+1],l);
					// R[l+r][j+1]=max(R[l+r][j+1],r);
				// }
				res=max(res,R[i][j]-L[i][j]+1+k);
			}
		for(int z=1;z<=k;z++)
		{
			for(int l=1,r=z;r<=n;l++,r++)
			{
				res=max(res,z+k+2*get(r+1,l-1));
				// printf("[%d %d]:%d\n",l,r,z+k+2*get(r,l));
			}
		}
		printf("%d\n",res);
	}
}

这程序好像有点Bug,我给组数据试试?

详细

Test #1:

score: 100
Accepted
time: 3ms
memory: 40660kb

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: 727ms
memory: 133804kb

input:

1
200000 66
jsmwjmibgkjvdscqllsxpaxiycmpauhnzschbivtqbjfrxrqvhvfbqecozjewqqpwdfbeqppjkgxhbnniopkptkygspcdswhwadfwhnzovvpshgcdukrupeztkpxwhmctaquqbxtidzbbxsyuaeikuldaoeudletrsmqptaejibkymsjhmwykqsjdvvdaqwelrcpxwrwhuvodipjniowfofbjktkdezwqqbvwsppsmpilntmdmlxgkaxymnugmmcsljkjzjuudnllydwdwwanadynsoiolso...

output:

141

result:

ok 1 number(s): "141"

Test #3:

score: 0
Accepted
time: 984ms
memory: 132068kb

input:

1
200000 100
qhiaajzxinenucrnfffumuhnovpuwcnojbhsktztapgyivmfqrlntwazwnfetwqieckxcnkskpidltiydfoveaucckximydxxfbiwbdufmbhywqkflyqxbijakadqkzftlciccbpnldsqhtjxuxnvkusvizavuyfhdroiuominebadhfqzrpjnzpgyvkejfwmueiltyeqpvwrkanqknyacqganbszktocfuvvsfrboaennwpaabfdnaurvvurysrijnfaonesihbhrrvbvyhpbremsuhhbc...

output:

209

result:

ok 1 number(s): "209"

Test #4:

score: 0
Accepted
time: 1691ms
memory: 46444kb

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: 252ms
memory: 146376kb

input:

1
200000 100
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...

output:

200100

result:

ok 1 number(s): "200100"

Test #6:

score: 0
Accepted
time: 754ms
memory: 143032kb

input:

1
200000 73
jgqahsycxmrrwvszqigkxmxxckratkgiyyqbxgjzaqkufvkgmepixhjdugpsntlsgtiedueukiytrytrcvlkymwibsfdhytbffmtaytnfczbavrrbdnpegwxubyeoopzopqhrwukohojtaizsureefffglwjfawvpqqnjteveuscyelgjiukskvymqejzwlnrjgvnpwnttzahoupruedryqeyahxgltnibxhbpxmhxxnmrebsgbjwsfpipezkekaqptnwtuanbfyfwyotwkrvlamnuvhunty...

output:

175682

result:

ok 1 number(s): "175682"

Test #7:

score: 0
Accepted
time: 1672ms
memory: 46076kb

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: 3397ms
memory: 43632kb

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: 602ms
memory: 51636kb

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: 1008ms
memory: 132072kb

input:

1
200000 100
cbdadabcbdaaacbedaccdeeeaabececdbcdebcedaeacddcdeaacaccedeadecacaabbdbdbbbbbeaecddbcaaeeaddcabcbebecebcddeccaeceacdebecaddcaddaaadaecabcbbbababedbbccbaceadaeccbbceaeacdccaaaabcbdaebcbcacaaeebebdddeeeeddcaaadbbbccacecacccebeeaabaecbdeccccbdbeedcddececabeaadeaadadcccbeebaecbacbccdbaceebdb...

output:

222

result:

ok 1 number(s): "222"

Test #11:

score: 0
Accepted
time: 967ms
memory: 131840kb

input:

1
200000 100
bcacdaadcdbcaeeebacabdaadebbceabaacdebddeacdebaabdccacdcacadbceceecdccebdebdbccdadbebbaebcabeddeabbdebdadcdedaadedbccbbdbcccdceddeadccdaadeecbebddcddccccbebccbbadaaadeeabaedecdacbeaabadcdeaeddadecdeddbeedeccaabaeebebdbecceaecbdcebceaadeebeaaceadebedcbdbdbcdbbecabddecabcdbccbbbecdaceabdd...

output:

220

result:

ok 1 number(s): "220"

Extra Test:

score: 0
Extra Test Passed