分析
关于着前缀,我本想用字典树的
结果MLE。。。无奈,就用了stupid的二分法
然后第二问打波表发现是斐波那契,加高精度即可
#pragma GCC optimize(2) #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; string s[10001]; int cnt; int n,m; bool Bin_Search(string a) { int l=1,r=n; while (l<=r) { int mid=l+r>>1; if (s[mid]>a) r=mid-1; else l=mid+1; } return !s[l].find(a,0); } int main() { scanf("%d%d",&n,&m); for (int i=1;i<=n;i++) cin>>s[i]; int ans1=0; sort(s+1,s+n+1); for (int i=1;i<=m;i++) { string a; cin>>a; ans1+=Bin_Search(a); } printf("%d ",ans1); int a[10001],b[10001],c[10001]; memset(a,0,sizeof a); memset(b,0,sizeof b); memset(c,0,sizeof c); a[1]=1;b[1]=2;b[0]=1; if (n<=3) printf("%d",n==1?1:(n==2?1:2)); for (int i=1;i<=n-2;i++) { for (int j=1;j<=b[0];j++) { c[j]=a[j]+b[j]+c[j]; c[j+1]=c[j]/10; c[j]%=10; } if (c[b[0]+1]>0) ++b[0]; for (int j=1;j<=b[0];j++) { a[j]=b[j]; b[j]=c[j];c[j]=0; } } for (int i=b[0];i;i--) printf("%d",b[i]); }