SGU 142 解题手记
原串不超过500000位,所以肯定有一个19位的串不是原串的子串,因为19位的串有2^19=524288种,而原串的19位子串数目只有499972个。
这样只需要统计原串的1至19位的子串就行了。
Submit 1: RTE on 11。把min(mask[k]+1,n)写成max了。
Submit 2: WA on 1。根本不该写出min(mask[k]+1,n)来,统计原串的k位子串跟k位串共有多少种没有关系。
Submit 3: AC。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | #include <algorithm> #include <cstdio> using namespace std; int main() { int mask[20]; for (int i=0;i<20;i++) mask[i]=(1<<i)-1; bool str[500000],substr[524288],find; int n; char c; scanf("%d\n",&n); for (int i(0);i<n;i++) { scanf("%c",&c); str[i]=(c=='b'); } for (int k=1;k<20;k++) { find=false; fill(substr,substr+mask[k],false); int s=0; for (int i(0);i<k-1;i++) s=(s<<1)|str[i]; for (int i=k-1;i<n;i++) substr[s=(s<<1)&mask[k]|str[i]]=true; for (int i=0;i<=mask[k];i++) if (!substr[i]) { printf("%d\n",k); for (int j=k-1;j>=0;j--) if (i>>j&1) printf("b"); else printf("a"); find=true; break; } if (find) break; } return 0; } |
