文章目錄
題目:[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;
}