当前位置 : 主页 > 编程语言 > c++ >

codeforces 1181 C. Flag

来源:互联网 收集:自由互联 发布时间:2021-06-23
题意:n*m的图。子矩阵为3个窄条(相邻位置字母不同),则为旗。问图中有几个旗。 先dfs记录各位置向下多长和它是同一个字母dp1[i][j]。然后各位置为左上角的旗的宽度一定为3*dp1[i

题意:n*m的图。子矩阵为3个窄条(相邻位置字母不同),则为旗。问图中有几个旗。

先dfs记录各位置向下多长和它是同一个字母dp1[i][j]。然后各位置为左上角的旗的宽度一定为3*dp1[i][j]。然后看看下面是否也行。如果行,mk1[i][j]记录dp1[i][j],mk2[i][j]记录3个字母是哪3个。

然后再从各位置dfs。如果和右边的mk1,mk2都相等,dp2[i][j]就等于右边的+1。所有dp2累加就是结果。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <iomanip>
#include <cstring>
#include <map>
#include <queue>
#include <set>
#include <cassert>
#include <stack>
#include <bitset>
#define mkp make_pair
#define err cout<<"err"<<endl
using namespace std;
const double EPS=1e-8;
typedef long long lon;
typedef unsigned long long ull;
typedef pair<int,int> pii;
const lon SZ=3010,SSZ=SZ*SZ,APB=4,one=1;
const lon INF=0x3f3f3f3f,mod=1000000007;
lon n,m,dp1[SZ][SZ];
char ch[SZ][SZ];
lon mk1[SZ][SZ],mk2[SZ][SZ];
lon dp2[SZ][SZ];

void dfs1(int x,int y)
{
    if(ch[x+1][y]==ch[x][y])
    {
        dfs1(x+1,y);
        dp1[x][y]=dp1[x+1][y]+1;
    }
    else dp1[x][y]=1;
}

void dfs2(int x,int y)
{
    if(y>m)return;
    if(mk1[x][y]==mk1[x][y+1]&&mk2[x][y]==mk2[x][y+1])
    {
        dfs2(x,y+1);
        dp2[x][y]=mk1[x][y]!=0?dp2[x][y+1]+1:0;
    }
    else dp2[x][y]=mk1[x][y]!=0;
}

void init()
{
    cin>>n>>m;
    for(int i=1;i<=n;++i)
    {
        for(int j=1;j<=m;++j)
        {
            cin>>ch[i][j];
        }
    }
    for(int i=1;i<=n;++i)
    {
        for(int j=1;j<=m;++j)
        {
            if(!dp1[i][j])
            {
                if(ch[i][j]==ch[i+1][j])
                {
                    dfs1(i+1,j);
                    dp1[i][j]=dp1[i+1][j]+1;
                }
                else dp1[i][j]=1;
            }
        }
    }
    for(int i=1;i<=n;++i)
    {
        for(int j=1;j<=m;++j)
        {
            int len=dp1[i][j];
            int pos1=i+len;
            int pos2=i+len+len;
            if(dp1[pos1][j]==len&&dp1[pos2][j]>=len)
            {
                mk1[i][j]=len;
                int a=ch[i][j]-0;
                int b=ch[pos1][j]-0;
                int c=ch[pos2][j]-0;
                mk2[i][j]=a+b*26+c*26*26;
            }
        }
    }
    memset(dp2,-1,sizeof(dp2));
    for(int i=1;i<=n;++i)
    {
        for(int j=1;j<=m;++j)
        {
            if(dp2[i][j]==-1)
            {
                if(mk1[i][j]==mk1[i][j+1]&&mk2[i][j]==mk2[i][j+1])
                {
                    dfs2(i,j+1);
                    dp2[i][j]=mk1[i][j]!=0?dp2[i][j+1]+1:0;
                }
                else dp2[i][j]=mk1[i][j]!=0;
            }
        }
    }
    int res=0;
    for(int i=1;i<=n;++i)
    {
        for(int j=1;j<=m;++j)
        {
            //if(dp2[i][j])cout<<i<<" "<<j<<" "<<dp2[i][j]<<endl;
            res+=dp2[i][j];
        }
    }
    cout<<res<<endl;
}

void work()
{
    
}

//9 8
//wmmmmrww
//wmmmmrww
//wxxxxgww
//ggggxgww
//ssssmcww
//xxxxzcww
//wkwwwkww
//wcccccww
//wwwwwwww

void release()
{
    
}

int main()
{
    std::ios::sync_with_stdio(0);
    //freopen("d:\\1.txt","r",stdin);
    lon casenum;
    //cin>>casenum;
    //cout<<casenum<<endl;
    //for(lon tim=1;tim<=casenum;++tim)
    //for(lon tim=1;cin>>n;++tim)
    {
        //cout<<"Case #"<<tim<<": ";
        init();
        work();
        release();
    }
    return 0;
}
网友评论