CF355div2

鏈接:http://codeforces.com/contest/677

c:Vanya and Label

題意:給你一個字符串s,每個字符可以用一個10進制數表示(0~63),現在要求有多少對與s長度一樣的字符串通過&得到s。

分析:只用64個數,直接暴力出每兩個數的&,然後相乘就行了。

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<queue>
#include<cmath>
#include<stack>
#include<set>
#include<map>
#define INF 0x3f3f3f3f
#define Mn 50010
#define Mm 2000005
#define mod 1000000007
#define CLR(a,b) memset((a),(b),sizeof((a)))
#define CLRS(a,b,Size) memset((a),(b),sizeof((a[0]))*(Size+1))
#define CPY(a,b) memcpy ((a), (b), sizeof((a)))
#pragma comment(linker, "/STACK:102400000,102400000")
#define ul u<<1
#define ur (u<<1)|1
using namespace std;
typedef long long ll;
ll get(char p) {
    int x=0;
    if(p>='0'&&p<='9') x=p-'0';
    else if(p>='a'&&p<='z') x=p-'a'+36;
    else if(p>='A'&&p<='Z') x=p-'A'+10;
    else if(p=='-') x=62;
    else if(p=='_') x=63;
    return x;
}
int a[70];
int main() {
    for(int i=0;i<64;i++) {
        for(int j=0;j<64;j++) {
            a[i&j]++;
        }
    }
    string s;
    cin>>s;
    ll sum=1;
    for(int i=0;i<s.size();i++) {
        sum=(sum*a[get(s[i])])%mod;
        //cout<<sum<<endl;
    }
    cout<<sum<<endl;
    return 0;
}
D:Vanya and Treasure
題意:給你一個n*m的矩陣,其中的數由1~p組成,現在要你找到一個1,2,.....p的順序的最短曼哈頓距離。

分析:我們可以將所有相同值得分成一個點集,然後由i的所有點更新到i+1的所有點,更新過程如下:

將i的所有點的橫軸標記爲i,並且計算出他們最小距離,然後到i+1中所有點的距離就是由縱軸上的i更新過來的。

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<queue>
#include<cmath>
#include<stack>
#include<set>
#include<map>
#define INF 0x3f3f3f3f
#define Mn 300*300+5
#define Mm 2000005
#define mod 1000000007
#define CLR(a,b) memset((a),(b),sizeof((a)))
#define CLRS(a,b,Size) memset((a),(b),sizeof((a[0]))*(Size+1))
#define CPY(a,b) memcpy ((a), (b), sizeof((a)))
#pragma comment(linker, "/STACK:102400000,102400000")
#define ul u<<1
#define ur (u<<1)|1
using namespace std;
typedef long long ll;
vector<int> a[Mn];
int ans[Mn];
int dis[Mn];
int vis[Mn];
int main() {
    int n,m,p,x;
    cin>>n>>m>>p;
    for(int i=0;i<n;i++) {
        for(int j=0;j<m;j++) {
            scanf("%d",&x);
            a[x].push_back(i*m+j);
        }
    }
    CLR(dis,0x3f);
    CLR(ans,0x3f);
    for(int i=0;i<m;i++) {
        dis[i]=i;
        vis[i]=0;
    }
    for(int i=1;i<=p;i++) {
        for(auto now:a[i]) {
            int a2=now/m,b2=now%m;
            for(int j=0;j<n;j++) {
                int pre=j*m+b2;
                if(vis[pre]==i-1) {
                    ans[now]=min(ans[now],dis[pre]+abs(j-a2));
                }
            }
        }
        for(auto now:a[i]) {
            int a2=now/m,b2=now%m;;
            for(int j=0;j<m;j++) {
                int ne=a2*m+j;
                if(vis[ne]!=i) {
                    vis[ne]=i;
                    dis[ne]=ans[now]+abs(b2-j);
                } else {
                    dis[ne]=min(dis[ne],ans[now]+abs(b2-j));
                }
            }
        }
    }
    cout<<ans[a[p][0]]<<endl;
    return 0;
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章