2
10
2017
0

CF Round #396

A.

 

A - Mahmoud and Longest Uncommon Subsequence
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
inline int F() {  register int aa , bb , ch;
    while(ch = getchar() , (ch<'0'||ch>'9') && ch != '-'); ch == '-' ? aa=bb=0 : (aa=ch-'0',bb=1);
    while(ch = getchar() , ch>='0'&&ch<='9') aa = aa*10 + ch-'0'; return bb ? aa : -aa;
}
const int Maxn = 100005;
char a[Maxn] , b[Maxn];
int main() {
    scanf("%s",a+1);
    scanf("%s",b+1);
    int lena = strlen(a+1);
    int lenb = strlen(b+1);
    if(lena != lenb) {
        printf("%d\n",max(lena,lenb));
    }
    if(lena == lenb) {
        bool flag = 0;
        for(int i=1; i<=lena; ++i) {
            if(a[i] != b[i]) {
                flag = 1;
                break;
            }
        }
        if(flag) printf("%d\n",lena);
        else puts("-1");
    }
}

B.

 

B - Mahmoud and a Triangle
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
inline int F() {  register int aa , bb , ch;
    while(ch = getchar() , (ch<'0'||ch>'9') && ch != '-'); ch == '-' ? aa=bb=0 : (aa=ch-'0',bb=1);
    while(ch = getchar() , ch>='0'&&ch<='9') aa = aa*10 + ch-'0'; return bb ? aa : -aa;
}
const int Maxn = 100010;
int n , a[Maxn];
int main() {
    n = F();
    if(n > 100) puts("YES");
    else {
        for(int i=1; i<=n; ++i) a[i] = F();
        for(int i=1; i<=n; ++i) {
            for(int j=i+1; j<=n; ++j) {
                for(int k=j+1; k<=n; ++k) {
                    if(a[i]+a[j] > a[k] && a[i]+a[k] > a[j] && a[j]+a[k] > a[i]) {
                        puts("YES"); return 0;
                    }
                }
            }
        }
        puts("NO");
    }
}

C.

 

C - Mahmoud and a Message
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <memory.h>
using namespace std;
inline int F() {  register int aa , bb , ch;
    while(ch = getchar() , (ch<'0'||ch>'9') && ch != '-'); ch == '-' ? aa=bb=0 : (aa=ch-'0',bb=1);
    while(ch = getchar() , ch>='0'&&ch<='9') aa = aa*10 + ch-'0'; return bb ? aa : -aa;
}
const int mod = 1000000007;
const int Maxn = 1005;
char s[Maxn];
int n , a[30] , mx = 0 , f[Maxn] , g[Maxn];
int main() {
    n = F();
    scanf("%s",s+1);
    for(int i=1; i<=26; ++i)
        a[i] = F();
    memset(g,42,sizeof(g));
    f[0] = 1; g[0] = 0;
    for(int i=1; i<=n; ++i) {
        int lim = max(0,i - a[s[i]-'a'+1]);
        for(int j=i-1; j>=lim; --j) {
            lim = max(lim , i - a[s[j]-'a'+1]);
            if(i-j > mx) mx = i-j;
            f[i] = (f[i] + f[j]) % mod;
            g[i] = min(g[i] , g[j]+1);
        }
    }
    printf("%d\n%d\n%d\n",f[n],mx,g[n]);
}

D.

 

D - Mahmoud and a Dictionary
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <stdio.h>
#include <string>
#include <string.h>
#include <iostream>
#include <map>
using namespace std;
inline int F() {  register int aa , bb , ch;
    while(ch = getchar() , (ch<'0'||ch>'9') && ch != '-'); ch == '-' ? aa=bb=0 : (aa=ch-'0',bb=1);
    while(ch = getchar() , ch>='0'&&ch<='9') aa = aa*10 + ch-'0'; return bb ? aa : -aa;
}
const int Maxn = 200010;
map <string , int> mp;
int n , m , q , fa[Maxn]; string tmp;
int find(int x) { return fa[x] == x ? x : (fa[x] = find(fa[x]));}
void ins(int a , int b) { fa[find(a)] = find(b); }
int main() {
    n = F() , m = F() , q = F();
    for(int i=1; i<=n; ++i) {
        cin>>tmp;
        mp[tmp] = i;
    }
    for(int i=1; i<=n+n; ++i) fa[i] = i;
    for(int i=1; i<=m; ++i) {
        int op = F();
        cin>>tmp;
        int a = mp[tmp];
        cin>>tmp;
        int b = mp[tmp];
        if(op == 1) {
            if(find(a) == find(b)) {
                puts("YES");
            }
            else if(find(a) == find(b+n)) {
                puts("NO");
            }
            else {
                puts("YES");
                ins(a,b); ins(a+n,b+n);
            }
        }
        else {
            if(find(a) == find(b)) {
                puts("NO");
            }
            else if(find(a) == find(b+n)) {
                puts("YES");
            }
            else {
                puts("YES");
                ins(a,b+n);
                ins(b,a+n);
            }
        }
    }
    for(int i=1; i<=q; ++i) {
        cin>>tmp;
        int a = mp[tmp];
        cin>>tmp;
        int b = mp[tmp];
        if(find(a) == find(b)) {
            puts("1");
        }
        else if(find(a) == find(b+n)) {
            puts("2");
        }
        else puts("3");
    }
}

E.

 

E - Mahmoud and a xor trip
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <stdio.h>
inline int F() {  register int aa , bb , ch;
    while(ch = getchar() , (ch<'0'||ch>'9') && ch != '-'); ch == '-' ? aa=bb=0 : (aa=ch-'0',bb=1);
    while(ch = getchar() , ch>='0'&&ch<='9') aa = aa*10 + ch-'0'; return bb ? aa : -aa;
}
const int Maxn = 100010;
const int Maxm = 2*Maxn;
int n , a[Maxn] , f[Maxn][30] , fa[Maxn] , bin[30] , size[Maxn];
int to[Maxm] , next[Maxm] , g[Maxn] , ecnt = 0;
long long ans;
void ins(int a , int b) { to[++ecnt] = b; next[ecnt] = g[a]; g[a] = ecnt;  }
void dfs(int x) {
    size[x] = 1;
    for(int i=0; i<30; ++i)
        if(a[x]&bin[i]) ++f[x][i];
    for(int i=g[x]; i; i=next[i]) {
        if(to[i] == fa[x]) continue;
        fa[to[i]] = x;
        dfs(to[i]);
        for(int j=0; j<30; ++j) {
            ans += (long long)bin[j] * (f[x][j] * (size[to[i]] - f[to[i]][j]) + f[to[i]][j] * (size[x] - f[x][j]));
            if(bin[j] & a[x]) f[x][j] += size[to[i]] - f[to[i]][j];
            else f[x][j] += f[to[i]][j];
        }size[x] += size[to[i]];
    }
}
int main() {
    bin[0] = 1; for(int i=1; i<30; ++i) bin[i] = bin[i-1]<<1;
    n = F();
    for(int i=1; i<=n; ++i) a[i] = F() , ans += a[i];
    for(int i=1; i<n; ++i) {
        int p = F() , q = F();
        ins(p , q); ins(q , p);
    }
    dfs(1); printf("%I64d\n",ans);
}
Category: Codeforces | Tags: | Read Count: 1005

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

Host by is-Programmer.com | Power by Chito 1.3.3 beta | Theme: Aeros 2.0 by TheBuckmaker.com