目录
正解
#include<bits/stdc++.h>
#define ll long long
#define pii pair<ll,ll>
using namespace std;
const ll N=1e6+10;
ll n;
char arr[N];
void solve()
{
scanf("%lld",&n);
scanf("%s",arr+1);
ll cont=min(n,7LL);
for(ll i=2; i<=cont; i++)
{
for(ll j=i; j<=n; j++)
{
ll cnt[3]= {0,0,0};
for(ll k=j-i+1; k<=j; k++) cnt[arr[k]-'a']++;
if(cnt[0]>cnt[1]&&cnt[0]>cnt[2])
{
printf("%lld\n",i);
return;
}
}
}
puts("-1");
}
int main()
{
ll t;
scanf("%lld",&t);
while(t--)
solve();
return 0;
}
解题
00:37:29 Wrong answer on pretest 2
前两题状态极佳,解题速度预计能上1500以内。
第三题延续前两题的状态,敏锐察觉到是一道结论题,但考虑前两题的状态对自己产生了信心,于是未做语法检查,未验证结论。
#include<bits/stdc++.h>
#define ll long long
#define pii pair<ll,ll>
using namespace std;
const ll N=1e3+10;
ll n;
char arr[N];
void solve()
{
scanf("%lld",&n);
scanf("%s",arr+1);
for(ll i=2;i<=n;i++)
{
if(arr[i]=='a'&&arr[i-1]=='a')
{
puts("2");
return;
}
}
for(ll i=3;i<=n;i++)
{
ll cnt=0;
for(ll j=i-2;j<=i;j++) cnt+=(arr[j]=='a');
if(cnt>=2)
{
puts("3");
return;
}
}
puts("-1");
}
int main()
{
ll t;
scanf("%lld",&t);
while(t--)
solve();
return 0;
}
00:47:33 Wrong answer on pretest 2
第二次尝试是最接近正解的一次,但显然题没刷多,还在担心暴力会超时。但运气好蒙了一个7 (大概是7是自己的幸运数字的缘故)。但是当时推出了一个结论:
a
>
b
,
a
>
c
⇒
a
+
a
>
b
+
c
,
a
+
b
+
c
=
l
e
n
⇒
a
+
a
>
l
e
n
−
a
⇒
a
×
3
>
l
e
n
a>b,a>c \\ \Rightarrow a+a>b+c,a+b+c=len \\ \Rightarrow a+a>len-a \\ \Rightarrow a\times 3>len
a>b,a>c⇒a+a>b+c,a+b+c=len⇒a+a>len−a⇒a×3>len
于是认为
a
×
3
>
l
e
n
⇒
a
>
b
,
a
>
c
a\times 3>len\Rightarrow a>b,a>c
a×3>len⇒a>b,a>c。
这个结论未验证,实际上abba即可。
且 未 做 语 法 检 查。
#include<bits/stdc++.h>
#define ll long long
#define pii pair<ll,ll>
using namespace std;
const ll N=1e3+10;
ll n;
char arr[N];
void solve()
{
scanf("%lld",&n);
scanf("%s",arr+1);
ll cont=min(n,7LL);
for(ll i=2;i<=n;i++)
{
if(arr[i]=='a'&&arr[i-1]=='a')
{
puts("2");
return;
}
}
for(ll i=3;i<=cont;i++)
{
for(ll j=i;j<=n;j++)
{
ll cnt=0;
for(ll k=j-i+1;k<=j;k++) cnt+=(arr[k]=='a');
if(cnt*3>i)
{
printf("%lld\n",i);
return;
}
}
}
puts("-1");
}
int main()
{
ll t;
scanf("%lld",&t);
while(t--)
solve();
return 0;
}
01:07:25 Wrong answer on pretest 2
思路完全歪了(大概)。
在这之后就不去考虑前面的思路了。(很正常,两次wa2很难不换思路。)
这时状态不太好了。
根据子串性质,想到是不是动态规划,再想加入一个字母对答案的贡献是怎样的……
然后灵光一现,这是类似最大子串和做法!
但是证明这个结论十分复杂,当时思路不清晰,证明不出来,但还是蒙着写了上去,自然是错了。
未验证,未检查
#include<bits/stdc++.h>
#define ll long long
#define pii pair<ll,ll>
using namespace std;
const ll N=1e3+10;
ll n;
char arr[N];
void solve()
{
scanf("%lld",&n);
scanf("%s",arr+1);
ll p=1;
ll cnta=0;
ll cntb=0;
ll cntc=0;
ll ans=n+1;
for(ll i=1;i<=n;i++)
{
if(arr[i]=='a') cnta++;
if(arr[i]=='b') cntb++;
if(arr[i]=='c') cntc++;
if(cnta>cntb&&cnta>cntc&&cnta+cntb+cntc>=2)
{
ans=min(ans,cnta+cntb+cntc);
cntb=cntc=0;
cnta=1;
}
if(cnta<cntb&&cnta<cntc||cnta==0) cnta=cntb=cntc=0;
}
if(ans==n+1) puts("-1");
else printf("%lld\n",ans);
}
int main()
{
ll t;
scanf("%lld",&t);
while(t--)
solve();
return 0;
}
01:17:33 Wrong answer on pretest 2
那个“结论”好不容易弄得“十分清晰”,但是仍然
未验证
未检查
(赛后发现这份竟然跑到了两千多组测试样例,然而说明不了这个结论是个正解)
状态不好,码风全无。
#include<bits/stdc++.h>
#define ll long long
#define pii pair<ll,ll>
using namespace std;
const ll N=1e3+10;
ll n;
char arr[N];
void solve()
{
scanf("%lld",&n);
scanf("%s",arr+1);
if(n==2)
{
if(arr[1]=='a'&&arr[2]=='a')
puts("2");
else
puts("-1");
return;
}
ll p=1;
ll cnta=0;
ll cntb=0;
ll cntc=0;
ll ans=n+1;
for(ll i=1; i<=n; i++)
{
if(arr[i]=='a') cnta++;
if(arr[i]=='b') cntb++;
if(arr[i]=='c') cntc++;
if(cnta>cntb&&cnta>cntc&&cnta+cntb+cntc>=2)
{
ans=min(ans,cnta+cntb+cntc);
cntb=cntc=0;
cnta=1;
}
if(cnta<cntb||cnta<cntc) cnta=cntb=cntc=0;
}
if(ans==n+1) puts("-1");
else printf("%lld\n",ans);
}
int main()
{
ll t;
scanf("%lld",&t);
while(t--)
solve();
return 0;
}
01:31:48 Accepted
终于开始造数据了,造着造着还在想什么循环节问题。
突然发现,长度为6且可能成为答案的字符串(abcbac)再加一个字母,不可能成为一个可能的答案,要不构不成,要不成为答案。真是撞上好运气了,突然想到原来的暴力,突然不用原来那个结论了,突然发现:
const ll N=1e3+10;
const ll N=1e3+10;
const ll N=1e3+10;
过了,但真不是滋味,没有继续看D题了。
#include<bits/stdc++.h>
#define ll long long
#define pii pair<ll,ll>
using namespace std;
const ll N=1e6+10;
ll n;
char arr[N];
void solve()
{
scanf("%lld",&n);
scanf("%s",arr+1);
ll cont=min(n,7LL);
for(ll i=2; i<=n; i++)
{
if(arr[i]=='a'&&arr[i-1]=='a')
{
puts("2");
return;
}
}
for(ll i=3; i<=cont; i++)
{
for(ll j=i; j<=n; j++)
{
ll cnta=0;
ll cntb=0;
ll cntc=0;
for(ll k=j-i+1; k<=j; k++)
{
cnta+=(arr[k]=='a');
cntb+=(arr[k]=='b');
cntc+=(arr[k]=='c');
}
if(cnta>cntb&&cnta>cntc)
{
printf("%lld\n",i);
return;
}
}
}
puts("-1");
}
int main()
{
ll t;
scanf("%lld",&t);
while(t--)
solve();
return 0;
}
总结
这还要总结?
检查语法错误!造数据!
检查语法错误!造数据!
检查语法错误!造数据!
检查语法错误!
检查语法错误!
检查语法错误!