- 感觉是截至目前做得最惨的一场CF比赛……B题多测没清空、C题被Hack、D题读错题意后陷入深深的自我怀疑……
C. Beautiful Sequence
- 原则上只要出现减法运算就要+mod %mod,因为模意义下无法判断究竟谁大谁小
#include <bits/stdc++.h>
using namespace std;
const int mod=998244353;
int power(int n,int p)
{
if(p==0)
{
return 1;
}
long long tmp=power(n,p/2);
if(p%2==1)
{
return tmp*tmp%mod*n%mod;
}
return tmp*tmp%mod;
}
int a[200005];
vector<int>c;
long long f[200005];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
int la=0,cnt=0,sum=0;
c.clear();
long long ans=0;
for(int i=1;i<=n;i++)
{
f[i]=0;
sum+=(a[i]==1);
cnt+=(a[i]==2);
if(a[i]==1)
{
c.push_back(cnt);
}
if(a[i]==3)
{
if(la)
{
f[i]=f[la]*power(2,cnt)%mod;
}
for(int j:c)
{
f[i]=(f[i]+power(2,cnt-j))%mod;
}
cnt=0;
la=i;
c.clear();
ans=(ans+f[i]-sum)%mod;
}
}
cout<<(ans+mod)%mod<<"\n";
}
return 0;
}
D. Palindrome Shuffle
- 没注意到reorder是重排列而不是倒序,感觉也是情有可原,毕竟四个样例按倒序理解都是对的……赛场上你判断要用manacher算法的话不可能过这么多人,也是准确的,只是没想到最后竟然是在题意理解上出了问题……定个小目标:以后每场英文比赛后都要背5个英语单词
- 首尾已经匹配好的子串不需要再动,剩余部分的两端至少要取一个
#include <bits/stdc++.h>
using namespace std;
int cnt[30];
int solve(string s)
{
int n=s.size();
int p=0;
while(p<n-1-p&&s[p]==s[n-1-p])
{
p++;
}
auto check=[p,n,&s](int x)
{
memset(cnt,0,sizeof(cnt));
if(x<n/2)
{
for(int i=p;i<=x;i++)
{
cnt[s[i]-'a']++;
}
for(int i=x+1;i<n/2;i++)
{
if(s[i]!=s[n-1-i])
{
return true;
}
}
for(int i=n-1-x;i<=n-1-p;i++)
{
if(cnt[s[i]-'a']==0)
{
return true;
}
else
{
cnt[s[i]-'a']--;
}
}
return false;
}
for(int i=p;i<=x;i++)
{
cnt[s[i]-'a']++;
}
for(int i=x+1;i<=n-p-1;i++)
{
if(cnt[s[i]-'a']==0)
{
return true;
}
else
{
cnt[s[i]-'a']--;
}
}
for(int i=0;i<26;i++)
{
if(cnt[i]%2==1)
{
return true;
}
}
return false;
};
return *ranges::partition_point(ranges::iota_view(p-1,n-p),check)-p+1;
}
int main()
{
ios::sync_with_stdio(true);
cin.tie(0);
int T;
cin>>T;
while(T--)
{
string s,t;
cin>>s;
t=s;
reverse(t.begin(),t.end());
cout<<min(solve(s),solve(t))<<"\n";
}
return 0;
}