#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e7+15;
const int INF=1e9;
vector<int> ds[MAXN];
int lay[MAXN],px[MAXN],py[MAXN],cnt[MAXN];
string s[3333];
bool bfs(int n)
{
    queue<int> Q;
    for(int i=1;i<=n;i++) if(!px[i]) Q.push(i),lay[i]=0;
    else lay[i]=1e9;
    bool f=false;
    while(!Q.empty())
    {
        int a=Q.front();
        Q.pop();
        for(auto v:ds[a]) if(px[a]!=v)
        {
            if(!py[v]) f=true;
            else if(lay[py[v]]==1e9) lay[py[v]]=lay[a]+1,Q.push(py[v]);
        }
    }
    return f;
}
bool dfs(int s)
{
    for(int& i=cnt[s];i+1;i--)
    {
        int v=ds[s][i];
        if(px[s]!=v) if(!py[v]||(lay[py[v]]==lay[s]+1&&dfs(py[v])))
        {
            if(px[s]) py[px[s]]=0;
            px[s]=v,py[v]=s;
            return true;
        }
    }
    return false;
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int n,m,sum=0;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
    	cin>>s[i];
		s[i]=' '+s[i];
	}
	for(int i=1;i<=n-2;i++)
	{
		for(int j=1;j<=m;j++) if(s[i][j]=='R'&&s[i+1][j]=='G'&&s[i+2][j]=='W')
		{
			if(s[i][j]=='R'&&s[i][j+1]=='G'&&s[i][j+2]=='W') ds[(i-1)*m+j].push_back((i-1)*m+j);
			if(j>1&&s[i+1][j-1]=='R'&&s[i+1][j]=='G'&&s[i+1][j+1]=='W') ds[(i-1)*m+j].push_back(i*m+j-1);
			if(j>2&&s[i+2][j-2]=='R'&&s[i+2][j-1]=='G'&&s[i+2][j]=='W') ds[(i-1)*m+j].push_back((i+1)*m+j-2);
			sum++;
		}
	}
	for(int i=1;i<=n;i++) for(int j=1;j<=m-2;j++) if(s[i][j]=='R'&&s[i][j+1]=='G'&&s[i][j+2]=='W') sum++;
	int ans=0;
    while(bfs(n))
    {
        for(int i=1;i<=n;i++) cnt[i]=ds[i].size()-1;
        for(int i=1;i<=n;i++) if(!px[i]) ans+=dfs(i);
    }
    cout<<sum-ans;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |