codeforces 1234F Yet Another Substring Reverse

mac2022-06-30  22

https://codeforces.com/problemset/problem/1234/F

比赛的时候看到20就想到的状压了,当时时间太少没想清楚怎么处理子集的问题

赛后发现可以直接枚举某一个状态的每一位去掉转移到这个状态,卧槽,再次ak不了 div3,E题写得太久了,坐标计算之类的东西还是不熟练。

#include<bits/stdc++.h> #define maxl 1000010 using namespace std; int n,ans; int f[1<<20]; bool in[21]; char s[maxl]; inline void prework() { scanf("%s",s+1); n=strlen(s+1); } inline void init() { for(int i=0;i<20;i++) in[i]=false; } inline void mainwork() { int msk; for(int i=1;i<=n;i++) { init();msk=0; for(int j=i;j<=n;j++) if(in[s[j]-'a']) break; else { in[s[j]-'a']=true; msk|=1<<(s[j]-'a'); f[msk]=max(f[msk],j-i+1); } } int up=1<<20; for(int s=1;s<up;s++) { for(int i=0;i<20;i++) if((s>>i)&1) f[s]=max(f[s],f[s^(1<<i)]); } for(int s=0;s<up;s++) ans=max(ans,f[s]+f[(up-1)^s]); } inline void print() { printf("%d",ans); } int main() { prework(); mainwork(); print(); return 0; }

 

最新回复(0)