NC53187. 勇者比太郎
描述
输入描述
从标准输入中读取数据。
第一行包括两个整数H,W,表示网格的高度和宽度。
接下来H行,第i行给出一个W位长的字符串,表示网格第i行的道具。
输出描述
输出数据到标准输出中。
输出一行一个整数,表示比太郎的咒语的威力。
示例1
输入:
3 4 JOIJ JIOO IIII
输出:
3
说明:
在这个样例中,3个四元组分别是(1,1,3,2),(2,1,3,3),(2,1,3,4)。示例2
输入:
4 4 JJOO JJOO IIJO IIIJ
输出:
17
C++14(g++5.4) 解法, 执行用时: 108ms, 内存消耗: 9296K, 提交时间: 2020-04-12 16:57:28
#include <bits/stdc++.h> using namespace std; const int maxn = 3e3 + 5; int l[maxn]; char s[maxn][maxn]; int main() { int H, W; scanf("%d%d", &H, &W); for(int i = 1; i <= H; i++) scanf("%s", s[i]+1); long long ans = 0; for(int i = H; i; i--) { int tmp = 0; for(int j = W; j; j--) if(s[i][j] == 'O') tmp++; else if(s[i][j] == 'I') l[j]++; else ans += tmp * l[j]; } printf("%lld", ans); return 0; }
C++11(clang++ 3.9) 解法, 执行用时: 765ms, 内存消耗: 79964K, 提交时间: 2020-04-13 00:00:02
#include<iostream> #define N 3010 using namespace std; int H,W; char n[N][N]; int a[N][N],b[N][N]; int main() { cin>>H>>W; for(int i=1;i<=H;i++) cin>>n[i]+1; for(int i=1;i<=H;++i) for(int j=W;j>=1;--j) a[i][j]=a[i][j+1]+(n[i][j]=='O'); for(int j=1;j<=W;++j) for(int i=H;i>=1;--i) b[i][j]=b[i+1][j]+(n[i][j]=='I'); long long ans=0; for(int i=1;i<=H;++i) for(int j=1;j<=W;++j) if(n[i][j]=='J') ans+=1LL*a[i][j+1]*b[i+1][j]; cout<<ans; return 0; }
C(clang 3.9) 解法, 执行用时: 108ms, 内存消耗: 9576K, 提交时间: 2020-04-12 15:07:53
#include<stdio.h> int main() { int i,j,h,w,num=0; char a[3100][3100]; long long ans=0; int b[3100]={0}; scanf("%d %d",&h,&w); for(i=1;i<=h;++i) scanf("%s",a[i]+1); for(i=h;i>0;--i) { for(j=1;j<=w;++j) if(a[i][j]=='I') b[j]++; num=0; for(j=w;j>0;--j) { if(a[i][j]=='O') num++; if(a[i][j]=='J') ans+=b[j]*num; } } printf("%lld",ans); return 0; }