一个关于数据读入的小问题
查看原帖
一个关于数据读入的小问题
457623
willow_Catkin楼主2024/8/28 18:31

在如下两个代码中, 唯一的差别是前者使用string读入数据, 后者使用char类型读入
但是在前者的提交结果中出现了大量的RE,并且只获得了25分的成绩, 后者AC 想知道其原因

//string
#include <iostream>
#include <cstring>
#include <cstdio>
#define int long long

using namespace std;

typedef long long ll;

const int N = 1e3 + 10;
const int P = 998244353;

int T, id;
int n, m, c, f;
string g[N];
int F[N][N], rig[N][N], dow[N][N];
int ansc = 0, ansf = 0;

signed main(){
   scanf("%lld%lld", &T, &id);
   while(T --){
   	ansc = ansf = 0;
   	scanf("%lld%lld%lld%lld", &n, &m, &c, &f);
   	for(int i = 1; i <= n; i ++){
   		cin >> g[i];
   		for(int j = m - 1; j >= 0; j --)
   			if(g[i][j] == '0') rig[i][j] = (j + 1 <= m - 1 && g[i][j + 1] == '0') ? rig[i][j + 1] + 1 : 0;
   			else rig[i][j] = -1;
   	}
   	for(int j = 0; j < m; j ++)
   		for(int i = n; i; i --)
   			if(g[i][j] == '0') dow[i][j] = (i + 1 <= n && g[i + 1][j] == '0') ? dow[i + 1][j] + 1 : 0;
   			else dow[i][j] = -1;
   	memset(F, -1, sizeof F);
   	for(int i = 1; i <= n; i ++)
   		for(int j = 0; j < m; j ++)
   			if(g[i][j] == '0') F[i][j] = rig[i][j] + ((i - 1 && g[i - 1][j] == '0') ? F[i - 1][j] : 0), F[i][j] %= P;
//		for(int i = 1; i <= n; i ++){
//			for(int j = 0; j < m; j ++) printf("%d ", dow[i][j]);
//			puts("");
//		}
   	for(int i = 1; i <= n; i ++)
   		for(int j = 0; j < m; j ++)
   			if(i - 2 && g[i][j] == '0' && g[i - 1][j] == '0' && g[i - 2][j] == '0'){
   				int k = (ll)rig[i][j] * F[i - 2][j] % P;
//					printf("%d, %d : k = %d\n", i, j + 1, k);
   				ansc = (ansc + k) % P;
   				ansf = (ansf + (ll)k * dow[i][j] % P) % P;
   			}
   	printf("%lld %lld\n", c % P * ansc % P, f % P * ansf % P);
   	for(int i = 1; i <= n; i ++)
   		g[i] = "";
   }
   return 0;
}

记录:string

#include <iostream>
#include <cstring>
#include <cstdio>
#define int long long

using namespace std;

typedef long long ll;

const int N = 1e3 + 10;
const int P = 998244353;

int T, id;
int n, m, c, f;
char g[N][N];
int F[N][N], rig[N][N], dow[N][N];
int ansc = 0, ansf = 0;

signed main(){
//	freopen("plant10.in", "r", stdin);
	scanf("%lld%lld", &T, &id);
	while(T --){
		ansc = ansf = 0;
		scanf("%lld%lld%lld%lld", &n, &m, &c, &f);
		for(int i = 1; i <= n; i ++){
			cin >> g[i];
			for(int j = m - 1; j >= 0; j --)
				if(g[i][j] == '0') rig[i][j] = (j + 1 <= m - 1 && g[i][j + 1] == '0') ? rig[i][j + 1] + 1 : 0;
				else rig[i][j] = -1;
		}
		for(int j = 0; j < m; j ++)
			for(int i = n; i; i --)
				if(g[i][j] == '0') dow[i][j] = (i + 1 <= n && g[i + 1][j] == '0') ? dow[i + 1][j] + 1 : 0;
				else dow[i][j] = -1;
		memset(F, -1, sizeof F);
		for(int i = 1; i <= n; i ++)
			for(int j = 0; j < m; j ++)
				if(g[i][j] == '0') F[i][j] = rig[i][j] + ((i - 1 && g[i - 1][j] == '0') ? F[i - 1][j] : 0), F[i][j] %= P;
//		for(int i = 1; i <= n; i ++){
//			for(int j = 0; j < m; j ++) printf("%d ", dow[i][j]);
//			puts("");
//		}
		for(int i = 1; i <= n; i ++)
			for(int j = 0; j < m; j ++)
				if(i - 2 && g[i][j] == '0' && g[i - 1][j] == '0' && g[i - 2][j] == '0'){
					int k = (ll)rig[i][j] * F[i - 2][j] % P;
//					printf("%d, %d : k = %d\n", i, j + 1, k);
					ansc = (ansc + k) % P;
					ansf = (ansf + (ll)k * dow[i][j] % P) % P;
				}
		printf("%lld %lld\n", c % P * ansc % P, f % P * ansf % P);
	}
	return 0;
}

记录:char

2024/8/28 18:31
加载中...