1. 程式人生 > >2017 計蒜之道 初賽 第一場

2017 計蒜之道 初賽 第一場

A.就是判斷每個線段是否有小紅的三個點,每個線段只有三個哦!

非常氣,迴圈寫成[0,6)了,改的時候沒改完

#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;
}
B.裸的KMP
#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;
}