真题演练2
ACM-ICPC 2017 Asia Qingdao
B. Chenchen, Tangtang and ZengZeng
签到题
I. The Squared Mosquito Coil
打印题,原来区域赛也会出这种题目,无语……
总结:遇到这种情况,冷静才是最重要的。
J. Suffix
按理来说暴力是会超时的,但是题目数据较水?变成了一道暴力题。那就优化一下吧,这里看到别人的做法有 二分找最长前缀+字符串hash来加速
同时这题要用上逆向思维,要从后往前推,才能满足最优情况。
#include <bits/stdc++.h> #define debug freopen("r.txt","r",stdin) #define mp make_pair #define ri register int using namespace std; typedef long long ll; typedef unsigned long long ull; const int maxn = 2e5+10; const int INF = 0x3f3f3f3f; const int mod = 998244353; const int base = 233; inline ll read(){ll s=0,w=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();} while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar(); return s*w;} ll qpow(ll p,ll q){return (q&1?p:1)*(q?qpow(p*p%mod,q/2):1)%mod;} int T,n,i,len[maxn],pos,nowlen,j,l,r,mid; string s[maxn]; ull Hash[maxn]; ull pw[maxn]; void init() { pw[0]=1; for (ri i=1;i<=maxn;i++) pw[i]=pw[i-1]*base; } ull getHash(int l,int r) { return Hash[r]-Hash[l-1]*pw[r-l+1]; } int main() { T=read(); init(); while (T--) { n=read(); for (i=1;i<=n;i++) { cin>>s[i]; len[i]=s[i].size(); } s[0]=""; for (i=n;i;i--) { pos=1; nowlen=s[i].size(); for (j=0;j<nowlen;j++) Hash[j+1]=Hash[j]*base+(s[i][j]-'a'); for (j=1;j<=len[i];j++) { l=0,r=nowlen-j+1; while (l<r) { mid=(l+r+1)>>1; if (getHash(pos,pos+mid-1)==getHash(j,j+mid-1)) l=mid; else r=mid-1; } if(pos-l+1<nowlen&&s[i][pos-1+l]>s[i][j-1+l]) { pos=j; } } s[i-1]+=s[i].substr(pos-1,nowlen-pos+1); } cout<<s[0]<<endl; } return 0; }
K. Our Journey of Xian Ends
首先题目一大串,看懂题意之后,就会知道这题是费用流了,建图套模板即可。
总结:是时候整理一波属于自己的模板了。