在如下两个代码中, 唯一的差别是前者使用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;
}
#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;
}