day13

Frost_Delay

2019-08-13 15:41:06

Personal

今天考的还行,190分,挤进了前40,T1签到题,1个桶就过了,T2字符串前缀与后缀匹配,我居然没想到KMP我%%%%%%%%,打了个暴力40分,T3以为是DP,但不会,随手打了个树状数组暴力枚举得了10分,有一个点WA搞不懂;T4暴力深搜,40分; 正解: T1排序后输出k个数即可 T2kmp T3不会。。。用线段树维护这个那个 T4折半搜索(估计T3T4要咕咕咕了,超出能力范围(~~逃~~)) T1 ```cpp #include<iostream> #include<cstdio> #include<algorithm> using namespace std; int n,f[110000],k; inline int read() { int x=0,f=1;char c=getchar(); while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c^48);c=getchar();} return f*x; } int main() { n=read();k=read(); for(int i=1;i<=n;i++) { int a=read(); f[a]++; } int w=0; for(int i=0;i<=n;i++) { while(w<k&&f[i]) { w++; printf("%d ",i); f[i]--; } } cout<<endl; return 0; } ``` T2 ```cpp #include<iostream> #include<cstdio> using namespace std; char c,a[400007]; int f[400007],l,ans,r,j,next[400007]; int main() { c=getchar(); while(c>='a'&&c<='z') { a[++l]=c; c=getchar(); } int j=0; for(int i=2;i<=l;i++) { while(j&&a[j+1]!=a[i])j=next[j]; if(a[j+1]==a[i])j++; next[i]=j; } next[0]=-1; while(j>-1) { if(a[j]==a[l]) f[++ans]=j; j=next[j]; } for(int i=ans;i>=1;i--) printf("%d ",f[i]); printf("%d\n",l); return 0; } ```