Nothing for nothing ( 八 )

題目:[The Smallest String Concatenation]

(http://codeforces.com/problemset/problem/632/C)
題意:就是給你n個字符串,每個字符串長度不超過50,問你把這些字符串拼接在一起使它的字典序最小。
思路:一開始就以爲是一個普通的字符串排序,利用sort的重載,後來發現存在一些問題,就是當字符串爲x, xxa, xxz,的時候排序結果跟樣例不一樣後來發現,當某個串爲另一個串的子串的時候會出現問題。所以就想到在sort的重載改一下條件,把兩個字符串拼接在一起。
代碼:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 5*1e4+10;
bool cmp(string a, string b){//重載排序
     return a+b < b+a;//拼接的方法
}
string a[maxn];
int main(){
    int n;
    ios::sync_with_stdio(false);
    cin>>n;
    for(int i = 0; i < n; i++){
        cin>>a[i];
    }
    sort(a, a+n, cmp);
    for(int i = 0; i < n; i++){
        cout<<a[i];
    }
    cout<<endl;
return 0;
}

題目:Longest k-Good Segment

題意:給你一個長度爲n的字符串,然後讓你求出不大於k個不同的數的區間範圍l和r。
思路:通過雙端隊列去維護,用vis數組標記這個數在不在雙端隊列中,用cn來記錄雙端隊列中不同數的個數。
代碼:

#include<bits/stdc++.h>
using namespace std;

const int maxn = 1e6+10;
int vis[maxn], a[maxn];
deque<int>q;
int main()
{
    int n, k;
    scanf("%d %d", &n, &k);
    for(int i = 0; i < n; i++)scanf("%d", &a[i]);
    while(q.size())q.pop_back();
    int ans = 0, l, r, cn = 0;
    memset(vis, 0, sizeof(vis));
    for(int i = 0; i < n; i++)
    {
        if(!vis[a[i]])cn++;//如果沒有被標記過,不同數的個數加1
        vis[a[i]]++;//標記一下
        q.push_back(i);
        while(q.size() && cn > k)//如果不同數的個數大於k彈出隊首的數
        {
            int t = q.front();
            vis[a[t]]--;
            if(!vis[a[t]])cn--;//如果這個數所有標記的都清空了,那麼cn--;
            q.pop_front();
        }
        if(q.size() && ans < i-q.front()+1)//更新最大範圍
        {
            ans = i-q.front()+1;
            l = q.front()+1;//因爲從0開始的所以l, r加1
            r = i+1;
        }
    }
    printf("%d %d\n", l, r);

    return 0;
}

題目:Mr. Kitayuta’s Colorful Graph

題意:本題的題意就是給你一個無向圖,n個點, m條邊,然後路徑是ai–bi,路的顏色是wi.
然後經過q次查詢,問你ui—vi這條邊之間間接或者直接有多少中顏色,每一種路顏色必須一樣。
思路:dfs+暴力
代碼:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1000;
int ne[maxn], e[maxn], h[maxn], w[maxn], tot = 0;
int vis[maxn], flag[maxn], ans = 0, res = 0;
void add(int u, int v, int val)//鏈式前向星存圖
{
    e[tot] = v;
    w[tot] = val;
    ne[tot] = h[u];
    h[u] = tot++;
}

void dfs(int u, int v, int val)//u是起點,v是重點,val是路的顏色。
{
    if(u == v)
    {
        ans = 1;
        return;
    }
    vis[u] = 1;
    for(int i = h[u]; ~i; i = ne[i])
    {
        int t = e[i];
        if(!vis[t] && w[i] == val)
        {
            vis[t] = 1;
            dfs(t, v, val);
            vis[t] = 1;
        }
    }
}
int main()
{
    int n, m;
    scanf("%d %d", &n, &m);
    memset(h, -1, sizeof(h));
    for(int i = 0; i < m; i++)
    {
        int u, v, w;
        scanf("%d %d %d", &u, &v, &w);
        add(u, v, w);
        add(v, u, w);
    }
    int q, u, v;
    scanf("%d", &q);
    for(int i = 0; i < q; i++)
    {
        res = 0;
        scanf("%d %d", &u, &v);
        memset(flag, 0, sizeof(flag));//用來保存該顏色是否已經存在
        for(int j = h[u]; ~j; j = ne[j])
        {
            ans = 0;
            memset(vis, 0, sizeof(vis));

            dfs(u, v, w[j]);
            if(flag[w[j]])continue;
            res += ans;
            flag[w[j]] = 1;
        }
        cout<<res<<endl;

    }
    return 0;
}


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