#ifndef Local
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#endif
#include <bits/stdc++.h>
#define int long long
#define pb push_back
#define lim 100000
using namespace std;
const int mod=1000000007ll;
bool st1[300][10][300],st2[300][10][300];
bool q1(int i,int j,int len){
int k=__lg(len);
//cerr<<i<<" "<<k<<" "<<j<<" "<<j+len-(1<<k)<<"\n";
return st1[i][k][j]||st1[i][k][j+len-(1<<k)];
}
bool q2(int i,int j,int len){
int k=__lg(len);
return st2[i][k][j]||st2[i][k][j+len-(1<<k)];
}
void solve(){
int n,m;
cin>>n>>m;
string grid[n];
for(int i=0;i<n;i++){
cin>>grid[i];
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
st1[i][0][j]=(grid[i][j]=='#');
//cerr<<st1[i][0][j]<<" ";
}//cerr<<"\n";
for(int j=1;j<=__lg(m);j++){
for(int k=0;k<m-(1<<(j-1));k++){
st1[i][j][k]=st1[i][j-1][k]||st1[i][j-1][k+(1<<(j-1))];
//cerr<<st1[i][j][k]<<" ";
//if(!i&&j==1&&!k)cerr<<st1[i][j][k]<<" "<<st1[i][j-1][k]<<" "<<st1[i][j-1][k+(1<<(j-1))]<<"\n";
}//cerr<<"\n";
}
}
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
st2[i][0][j]=(grid[j][i]=='#');
//cerr<<st2[i][0][j]<<" ";
}//cerr<<"\n";
for(int j=1;j<=__lg(n);j++){
for(int k=0;k<n-(1<<(j-1));k++){
st2[i][j][k]=st2[i][j-1][k]||st2[i][j-1][k+(1<<(j-1))];
//cerr<<st2[i][j][k]<<" ";
}//cerr<<"\n";
}
}
/*
int q;
cin>>q;
while(q--){
int i,j,len;
cin>>i>>j>>len;
cerr<<q2(i,j,len)<<"\n";
}
*/
//cerr<<st1[0][1][0]<<"\n";
//cerr<<q1(0,0,2)<<"\n";
int ans=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
int most=m-j;
//cerr<<i<<" "<<j<<"\n\n";
for(int k=0;k+i<n;k++){
while(most&&q1(i+k,j,most))most--;
if(!most)break;
ans+=(k+1)*most*(most+1)/2;
//err<<i+k<<" "<<k<<" "<<most<<"\n";
}
//cerr<<"\n\n";
/*
cerr<<ans<<"\n\n";
cerr<<"\n";
most=n-i;
for(int k=0;k+j<m;k++){
while(most&&q2(j+k,i,most))most--;
cerr<<j+k<<" "<<k<<" "<<most<<"\n";
if(!most)break;
ans+=(k+1)*most;
}
cerr<<"\n\n";
*/
}
}
cout<<ans<<"\n";
}
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);cout.tie(NULL);
#ifdef Local
freopen("in","r",stdin);
freopen("out","w",stdout);
#endif
int t=1;
//cin>>t;
while (t--)
{
solve();
}
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
348 KB |
Output is correct |
2 |
Correct |
0 ms |
348 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
348 KB |
Output is correct |
2 |
Correct |
0 ms |
348 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
21 ms |
2136 KB |
Output is correct |
2 |
Correct |
27 ms |
2136 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
21 ms |
2136 KB |
Output is correct |
2 |
Correct |
26 ms |
2316 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
37 ms |
2140 KB |
Output is correct |
2 |
Correct |
26 ms |
2140 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
8 ms |
4444 KB |
Execution killed with signal 11 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
12 ms |
7516 KB |
Execution killed with signal 11 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
9 ms |
5724 KB |
Execution killed with signal 11 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
3 ms |
2908 KB |
Execution killed with signal 11 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
14 ms |
10996 KB |
Execution killed with signal 11 |
2 |
Halted |
0 ms |
0 KB |
- |