2017.07.14 训练2

来源:互联网 发布:saa7130监控软件 编辑:程序博客网 时间:2024/05/19 13:55

电大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();}
原创粉丝点击