A - Pangram :判断一个字符串中有木有出现过26个字母,不论大小写,有YES没有NO
#include <map> #include <set> #include <queue> #include <stack> #include <vector> #include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define lson l, mid, rt << 1 #define rson mid + 1, r, rt << 1 | 1 #define pi acos(-1.0) #define eps 1e-8 typedef long long ll; const int inf = 0x3f3f3f3f; char a[1000]; int cnt; int vis[30]; int main() { int n; while( ~scanf("%d", &n )) { scanf("%s", a); if( n < 26 ) { cout << "NO" << endl; continue; } cnt = 0; int len = strlen( a ); memset( vis, 0, sizeof( vis )); for( int i = 0; i < len; i++ ) { if( a[i] <= 'z' && a[i] >= 'a' ) { if( !vis[ a[i] - 'a' ] ) { cnt++; vis[ a[i] -'a' ] = 1; } } else { if( !vis[ a[i] - 'A'] ) { cnt++; vis[ a[i] - 'A' ] = 1; } } } if( cnt == 26 ) puts("YES"); else puts("NO"); } return 0; }
B - Two Buttons
n变到m,要么乘以2,要么减去1,的最小步数。简单bfs
#include <map> #include <set> #include <queue> #include <stack> #include <vector> #include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define lson l, mid, rt << 1 #define rson mid + 1, r, rt << 1 | 1 #define pi acos(-1.0) #define eps 1e-8 typedef long long ll; const int inf = 0x3f3f3f3f; int n, m; struct nod{ int x, s; }; int vis[100010]; queue <nod> q; int bfs( int st, int ed ) { while( !q.empty() ) q.pop(); memset( vis, 0, sizeof( vis ) ); nod t; t.x = st, t.s = 0; vis[st] = 1; q.push( t ); while( !q.empty() ) { nod now = q.front(); q.pop(); if( now.x == ed ) { return now.s; } nod nxt; nxt.s = now.s + 1; if( !vis[ now.x << 1] && ( now.x << 1 ) <= 10000 )//注意不能超过范围 { nxt.x = now.x << 1; q.push( nxt ); vis[nxt.x] = 1; } if( !vis[ now.x - 1 ] ) { nxt.x = now.x - 1; if( nxt.x < 0 ) continue; q.push( nxt ); vis[nxt.x] = 1; } } } int main() { while( ~scanf("%d%d", &n, &m)) { if( n <= 0 ) { cout << "0" << endl; continue; } if( m <= n ) { printf("%d\n", n - m); continue; } int ans = bfs( n, m ); cout << ans << endl; } return 0; }
C - DNA Alignment
h函数是两个相同长度的字符串,在同位置相同字符的数量,p函数是循环移位后得到的总和,然后给出S串求使p函数最大的T串有几个。
首先得到T串里的字符就是S里面字符出现最多的字符,当有多个字符出现次数一样的话,那么该位置填哪个都没关系了,又因为有n位,所以最后结果就是出现的最大次数的字母的^n
#include <set> #include <vector> #include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const double pi = acos(-1); const int inf = 0x3f3f3f3f; const double eps = 1e-15; const int mod = 1e9 + 7; typedef long long LL; typedef pair <int, int> PLL; char str[100110]; int num[100]; int main () { int n; while (~scanf("%d", &n)) { int maxs = 0; scanf("%s", str); memset (num, 0, sizeof(num)); for (int i = 0; i < n; ++i) { ++num[str[i]]; maxs = max (maxs, num[str[i]]); } int cnt = 0; if (num['A'] == maxs) { ++cnt; } if (num['G'] == maxs) { ++cnt; } if (num['T'] == maxs) { ++cnt; } if (num['C'] == maxs) { ++cnt; } LL ans = 1; for (int i = 1; i <= n; ++i) { ans *= (LL)cnt; ans %= mod; } cout << ans << endl; } return 0; }