电大training7 div2:
补题:https://vjudge.net/contest/170559#problem/G
这题很好,,还是看别人代码。。大概又懂了 hash和
上代码。
这里有挺多自己不会的和不熟的。1:前缀和,2:hash,3:把字母个数怎么变为abc
const int maxn=4050;
char s[maxn],t[maxn];
int s1[maxn][27],s2[maxn][27];
const ULL seed=23,seed2=1e9+7;
ULL gethash(int *v){
ULL h=seed;
for(int i=0;i<=25;++i){
h*=seed2;
h+=v[i];
}return h;
}
map<ULL,int>mp;
int main(){
sf("%s%s",s+1,t+1);
int n=strlen(s+1),m=strlen(t+1);
for(int i=1;i<=n;++i){
memcpy(s1[i],s1[i-1],sizeof(s1[i-1]));
s1[i][s[i]-'a']++;//前缀和
}
for(int i=1;i<=m;++i){
memcpy(s2[i],s2[i-1],sizeof(s2[i-1]));
s2[i][t[i]-'a']++;
}
int ans=0;
for(int len=1;len<=min(n,m);++len){
mp.clear();
for(int i=1;i+len-1<=n;++i){
int a[26];
for(int j=0;j<=25;++j){
a[j]=s1[i+len-1][j]-s1[i-1][j];
}
mp[gethash(a)]++;
}
for(int i=1;i+len-1<=m;++i){
int b[26];
for(int j=0;j<=25;++j){
b[j]=s2[i+len-1][j]-s2[i-1][j];
}
if(mp[gethash(b)]){ans=len;break;}
}
}
pf("%d\n",ans);
}
https://vjudge.net/contest/170559#problem/F
这题本来也说是水题的。。。但是自己没想出来。 而且刚看别人的代码还看不懂。。
int l[2*maxn],r[2*maxn];
struct Node{
int pos;
int id;
bool friend operator<(Node a,Node b){
return a.pos<b.pos;
}
}node[maxn];
int main(){
int n,m;
sf("%d%d",&n,&m);
rep(i,1,200000)l[i]=r[i]=i;
rep(i,1,m){
sf("%d%d",&node[i].pos,&node[i].id);
}
sort(node+1,node+1+m);
rep(i,1,m){
int x=node[i].id,y=node[i].id+1;
l[y]=l[x]=min(l[x],l[y]);
r[y]=r[x]=max(r[x],r[y]);
}
rep(i,1,n){
pf("%d%c",r[i]-l[i]+1,i==n?'\n':' ');
}
}
补题 scut training 2:https://vjudge.net/contest/170300#problem/C
复习了下kmp。。。http://www.cnblogs.com/c-cloud/p/3224788.html
然后这题很巧妙。还是多做题才能知道。。
char s[maxn];
int nxt[maxn];
int cnt[maxn];
int vis[maxn];
int main(){
int n,q;
sf("%d%d",&n,&q);
sf("%s",s);
int i,k=0;
for(i=1;i<n;++i){
while(k>0&&s[i]!=s[k])k=nxt[k-1];
if(s[i]==s[k])k++;
nxt[i]=k;
}
while(q--){
int op;sf("%d",&op);
if(op==1){
sf("%s",s+n);
n++;
while(k>0&s[i]!=s[k])k=nxt[k-1];
if(s[i]==s[k])k++;
nxt[i]=k;
cnt[++i]=cnt[k];//即是原来的 n+1, 反正就是那个位置的满足后缀数
}else if(op==2){
if(!vis[i]){
vis[i]=1;
cnt[i]++;
}
}else{
pf("%d\n",cnt[n]);
}
}
}
cf D https://vjudge.net/problem/CodeForces-831D
这个地方的贪心想不出来。。。
LL a[maxn],b[maxn];
void solve(){
sort(a+1,a+n+1);
sort(b+1,b+k+1);
LL ans=2*inf;
for(int i=1;i<=k-n+1;++i){
LL sum=0;
for(int j=1;j<=n;++j){
sum=max(sum,abs(a[j]-b[i+j-1])+abs(b[i+j-1]-p));
}
ans=min(sum,ans);
}
cout<<ans<<endl;
}
int main(){
sf("%d%d%d",&n,&k,&p);
rep(i,1,n)sf("%d",&a[i]);
rep(i,1,k)sf("%d",&b[i]);
solve();
}