#include <iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
char a[2000+10];
long long sumline[2000+10][2000+10];
int main()
{
long long n,m;
while(scanf("%I64d%I64d",&n,&m)!=EOF)
{
int i,q,w,l;
int nel[2000+100]={0};
memset(a,0,sizeof(a));
memset(sumline,0,sizeof(sumline));
long long result[3000]={0};
long long rr=0;
for(w=1;w<=n;w++)
{
{
scanf("%s",&a[1]);
for(q=1;q<=m;q++)
{
if(a[q]=='w')sumline[w][q]=sumline[w-1][q]+1;
else sumline[w][q]=0;
}
}
int stack[2000+100]={0};
for(i=1;i<=m;i++)
{
nel[i]=i;
}
int top=-1;
memset(result,0,sizeof(result));
for(i=1;i<=m;i++)
{
int ff=-1;
while(top>=0&&sumline[w][stack[top]]>=sumline[w][i])
{
nel[i]=nel[stack[top]];
stack[top]=-1;
top--;
}
ff=stack[top];
//for(int iw=0;iw<=3;iw++)
//printf("stack[%d]=%d\n",iw,stack[iw]);
//printf("ff=%d\n",ff);
top++;
stack[top]=i;
result[i]=sumline[w][i]*(i-nel[i]+1)+(ff>=0?result[ff]:0);
rr+=result[i];
//printf("rr:%I64d result[ff(%d)]:%I64d result[w(%d)]:%I64d gao:%I64d kuan:%d zhong:%d qi:%d\n",rr,result[ff],ff,result[w],w,sumline[w][i],(i-nel[i]+1),i,nel[i]);
}
}
printf("%I64d\n",rr);
}
return 0;
}
FZU2190(单调栈)
最新推荐文章于 2019-09-01 23:20:04 发布