2017 計蒜之道 初賽 第一場
阿新 • • 發佈:2019-01-29
A.就是判斷每個線段是否有小紅的三個點,每個線段只有三個哦!
非常氣,迴圈寫成[0,6)了,改的時候沒改完
B.裸的KMP#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long ll; int a[10][10]; int main() { int n,m; cin>>n>>m; int x,y; for(int i = 1;i <= n;i++) { scanf("%d%d",&x,&y); a[x+3][y+3] = 1; } for(int i = 1;i <= m;i++) { scanf("%d%d",&x,&y); a[x+3][y+3] = -1; } int sum = 0; for(int i = 0;i <= 6;i++) { if(i == 3) { if(a[i][0] + a[i][1] + a[i][2] == 3) sum++; if(a[i][4]+a[i][5]+a[i][6] == 3) sum++; } else { int cnt = 0; for(int j = 0;j <= 6;j++) { cnt += a[i][j]; } if(cnt == 3) sum++; } } for(int i = 0;i <= 6;i++) { if(i == 3) { if(a[0][i]+a[1][i]+a[2][i] == 3) sum++; if(a[4][i]+a[5][i]+a[6][i] == 3) sum++; } else { int cnt = 0; for(int j = 0;j <= 6;j++) { cnt += a[j][i]; } if(cnt == 3) sum++; } } cout<<sum<<endl; }
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long ll; const int N = 1e6+5; int x[N]; char str[N],p[N]; int Next[N]; void Getfail(int m) { Next[0]=-1; int i=0,j=-1; while(i<m) { if(j==-1||p[i]==p[j])//匹配 { i++,j++; Next[i]=j; } else j=Next[j]; } } int KMP(int n,int m) { int i=0,j=0,ans=0; while(i<n) { if(j==-1) { i++,j++; } if(str[i]==p[j]) { if(j==m-1) { ans++; j=Next[j]; } else { i++,j++; } } else j=Next[j]; } return ans; } int main() { int n,a,b,L,R; cin>>n>>a>>b>>L>>R; scanf("%s",p); x[0] = b; if(x[0] >= L && x[0] <= R && x[0] % 2 == 0) str[0] = 'A'; else if(x[0] >= L && x[0] <= R && x[0] % 2 == 1) str[0] = 'T'; else if((x[0] < L || x[0] > R) && x[0] % 2 == 0) str[0] = 'G'; else if((x[0] < L || x[0] > R) && x[0] % 2 == 1) str[0] = 'C'; for(int i = 1;i < n;i++) { x[i] = (x[i-1]+a)%n; if(x[i] >= L && x[i] <= R && x[i] % 2 == 0) str[i] = 'A'; else if(x[i] >= L && x[i] <= R && x[i] % 2 == 1) str[i] = 'T'; else if((x[i] < L || x[i] > R) && x[i] % 2 == 0) str[i] = 'G'; else if((x[i] < L || x[i] > R) && x[i] % 2 == 1) str[i] = 'C'; } //cout<<str<<endl; int m = strlen(p); Getfail(m); cout<<KMP(n,m)<<endl; return 0; }
C.
D.
待補
都不會,貼個matthew99大佬的程式碼:
#include <bits/stdc++.h> using namespace std; #define REP(i, a, b) for (int i = (a), i##_end_ = (b); i < i##_end_; ++i) #define debug(...) fprintf(stderr, __VA_ARGS__) #define mp make_pair #define x first #define y second #define pb push_back #define SZ(x) (int((x).size())) #define ALL(x) (x).begin(), (x).end() template<typename T> inline bool chkmin(T &a, const T &b) { return a > b ? a = b, 1 : 0; } template<typename T> inline bool chkmax(T &a, const T &b) { return a < b ? a = b, 1 : 0; } typedef long long LL; const int oo = 0x3f3f3f3f; const int maxn = 1000100; inline void get_nxt(char *a, int n, int *nxt) { int i = 1, j = 0; nxt[1] = nxt[0] = 0; while (i < n) { while (j && a[i] != a[j]) j = nxt[j]; if (a[i] == a[j]) ++j; ++i; nxt[i] = j; } } int N, a, b, L, R; int n; char s[maxn + 5]; vector<pair<int, int> > seg[2]; inline void add_seg(int l, int r, int oddity) { if (l < N) seg[oddity].pb(mp(l, min(r, N))); if (r > N) seg[oddity ^ (N & 1)].pb(mp(max(l, N) - N, r - N)); } inline void ban(int l, int r, int oddity, int step) { if ((a & step) & 1) oddity = !oddity; l = (l - (LL)a * step) % (2 * N); if (l < 0) l += 2 * N; r = (r - (LL)a * step) % (2 * N); if (r < 0) r += 2 * N; if (l > r) add_seg(0, r, oddity), add_seg(l, 2 * N, oddity); else add_seg(l, r, oddity); } int nxt[maxn + 5]; int ans; int main() { #ifdef matthew99 freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); #endif scanf("%d%d%d%d%d", &N, &a, &b, &L, &R), ++R; scanf("%s", s); n = strlen(s); get_nxt(s, n, nxt); if (n > N) { printf("0\n"); return 0; } REP(i, 0, n) { if (s[i] == 'A') { ban(0, L, 0, i); ban(0, L, 1, i); ban(R, N, 0, i); ban(R, N, 1, i); ban(L, R, 1, i); } else if (s[i] == 'T') { ban(0, L, 0, i); ban(0, L, 1, i); ban(R, N, 0, i); ban(R, N, 1, i); ban(L, R, 0, i); } else if (s[i] == 'G') { ban(0, L, 1, i); ban(R, N, 1, i); ban(L, R, 0, i); ban(L, R, 1, i); } else if (s[i] == 'C') { ban(0, L, 0, i); ban(R, N, 0, i); ban(L, R, 0, i); ban(L, R, 1, i); } } REP(oddity, 0, 2) { sort(ALL(seg[oddity])); int lst = 0; for (auto u : seg[oddity]) { if (u.x > lst) ans += ((u.x + !oddity) >> 1) - ((lst + !oddity) >> 1); chkmax(lst, u.y); } ans += ((N + !oddity) >> 1) - ((lst + !oddity) >> 1); } int now = (b - (LL)a * (n - 1)) % N; (now += N) %= N; int j = 0; REP(i, 0, (n << 1) - 2) { char cur = -1; if (now >= L && now < R) { if (now & 1) cur = 'T'; else cur = 'A'; } else { if (now & 1) cur = 'C'; else cur = 'G'; } while (j && cur != s[j]) j = nxt[j]; if (cur == s[j]) ++j; if (j == n) --ans; (now += a) %= N; } printf("%d\n", ans); return 0; }