1. 程式人生 > >暑期集訓補題系列Day2--模擬/暴力求解進階

暑期集訓補題系列Day2--模擬/暴力求解進階

Day 2–模擬/暴力求解進階

E - String Typing Codeforces 954B substr用法: s.substr(i,j)表示從下標為i的位置開始擷取j位

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,len=1;
    string s;
    cin>>n>>s;
    for(int i=1; i<=n; i++)
        if(s.substr(0,i)==s.substr(i,i))///s.substr(i,j)表示從下標為i的位置擷取j位字元,判斷最長迴圈節
len=i; cout<<n-len+1<<endl; return 0; }

I - Game of Robots Codeforces 670B 題意:

n 個機器(標號唯一)人站一列按照一定的規則進行報號遊戲,問報出的第 k 個編號是什麼

#include<stdio.h>
const int MYDD=1e5+1103;
 
int robot[MYDD];
 
int main() {
	int n,k;
	while(scanf("%d%d",&n,&k)!=EOF) {
		for(int j=
1; j<=n; j++) scanf("%d",&robot[j]); for(int i=1; i<=n; i++) { if(k-i>0) k=k-i; else break; }\ printf("%d\n",robot[k]); } return 0; }

J - Xor-Paths Codeforces 1006F 題意:從左上走到右下,每次只能向右或下走,問走到右下角時路徑異或和為k的路徑數 直接暴力dfs的話複雜度為240 所以我們用雙向dfs 複雜度為2*220=221 用map記錄路徑異或和 從左上跑一半,右下跑一半 跑到相同點時將答案傳回 先貼出我的DFS程式碼,顯然超時了

#include <bits/stdc++.h>
using namespace std;

int G[21][21];
int n, m, k, ans;

void dfs(int x, int y, int xorSum) {
	if(x == n && y == m) {
		if(xorSum == k) {
			ans++;
		}
		return;
	}
	if((x + 1) <= n && y <= m) {
		dfs(x + 1, y, xorSum ^ G[x + 1][y]);
	}
	if(x <= n && (y + 1) <= m) {
		dfs(x, y + 1, xorSum ^ G[x][y + 1]);	
	}
}

int main() {
	//freopen("input.txt", "r", stdin);
	scanf("%d %d %d", &n, &m, &k);
	for(int i = 1; i <= n; i++) {
		for(int j = 1; j <= m; j++) {
			scanf("%d", &G[i][j]);
		}
	}
	dfs(1, 1, G[1][1]);
	printf("%d\n", ans);
	//fclose(stdin);
	return 0;
}

下面是正解

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
using namespace std;
typedef long long ll;
int n,m;
ll k;
ll a[25][25];
map<ll,ll> dp[25];
void dfs(int x,int y,ll s)
{
    if (x>n||y>m) return;
    if ((x+y)==(n+m)/2+1) {dp[x][s^a[x][y]]++;return;}
    dfs(x+1,y,s^a[x][y]);dfs(x,y+1,s^a[x][y]);
}
ll solve(int x,int y,ll s)
{
    if (x<1||y<1) return 0;
    if ((x+y)==(n+m)/2+1) return dp[x][s];
    return solve(x-1,y,s^a[x][y])+solve(x,y-1,s^a[x][y]);
}
int main()
{
    scanf("%d%d%I64d",&n,&m,&k);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            scanf("%I64d",&a[i][j]);
    dfs(1,1,0);
    printf("%I64d\n",solve(n,m,k));
    return 0;
}