#include<bits/stdc++.h>
using namespace std;
#define foru(i,a,b) for(int i=(a); i<=(b); ++i)
#define ford(i,a,b) for(int i=(a); i>=(b); --i)
#define rep(i,a) for(int i=0; i<(a); ++i)
#define sz(a) (int)(a).size()
#define all(a) (a).begin(),(a).end()
#define bit(s,i) (((s)>>(i))&1)
#define ii pair<int,int>
#define fi first
#define se second
#define pb push_back
#define eb emplace_back
#define ll long long
#define _ << " " <<
template <class X, class Y> bool maxi(X &x, Y y){return x<y?x=y,true:false;}
template <class X, class Y> bool mini(X &x, Y y){return x>y?x=y,true:false;}
string d="SNWE";
int dx[]={1,-1,0,0};
int dy[]={0,0,-1,1};
const int H=800;
int m,r,c,tim[16],resis[H*H];
int minInf=-1,cntInf;
string s;
vector<ii> edge;
int id(int i, int j){
return i*c+j;
}
bool inBoard(int x, int y){
return x>=0 && y>=0 && x<r && y<c;
}
void pr(int x){
cout<<x/c _ x%c<<'\n';
}
void timeCalc(){
s=s+s; m=m*2;
rep(msk,1<<4){
int cnt=0;
rep(i,m){
bool chk=0;
rep(j,4) if(bit(msk,j) && s[i]==d[j]) chk=1;
if(chk){
++cnt;
}
else{
maxi(tim[msk],cnt);
cnt=0;
}
}
maxi(tim[msk],cnt);
if(cnt==m) tim[msk]=1e9;
}
}
int par[H*H],vis[H*H],cntVis; bool done[H*H];
int find(int x){
return par[x]==x?x:par[x]=find(par[x]);
}
void bfs(int x){
queue<int>q;
q.push(x);
int num=0;
vis[x]=++cntVis;
// if(x==id(2,0))cout<<"ahihi\n";
while(q.size()){
int u=q.front(); q.pop(); ++num;
// if(x==id(2,0))pr(u);
rep(i,4){
int vx=u/c+dx[i], vy=u%c+dy[i], v=id(vx,vy);
if(!inBoard(vx,vy) || vis[v]==cntVis || !resis[v]) continue;
ll msk=0;
rep(j,4){
int wx=vx+dx[j], wy=vy+dy[j], w=id(wx,wy);
if(!inBoard(wx,wy) || vis[w]!=cntVis) continue;
msk|=(1<<j);
// if(u==id(1,0)&&v==id(0,0)) cout<<j _ wx _ wy<<'\n';
}
if(tim[msk]>=resis[v]){
if(find(v)==find(u)){
vis[v]=cntVis;
q.push(v);
} else{
edge.eb(u,v);
return;
}
}
}
}
done[x]=true;
if(minInf==-1 || minInf>num){
cntInf=num;
minInf=num;
} else if(minInf==num){
cntInf+=num;
}
}
void mainCalc(){
iota(par,par+r*c,0);
while(true){
rep(i,r*c) if(par[i]==i && resis[i] && !done[i]) bfs(i);//,cerr<<i _ i/c _ i%c<<'\n';
if(edge.size()==0) break;
for(auto[x,y]:edge){
// pr(x);pr(y);cout<<'\n';
x=find(x);y=find(y);
par[x]=y;
}
edge.clear();
// break;
}
}
void solve(){
cin>>m>>r>>c>>s;
rep(i,r*c) cin>>resis[i];
timeCalc();
mainCalc();
cout<<minInf<<'\n'<<cntInf<<'\n';
}
int32_t main(){
#define task "test"
if(fopen(task".inp","r")){
freopen(task".inp","r",stdin);
freopen(task".out","w",stdout);
}
cin.tie(0)->sync_with_stdio(0);
int tc=1; //cin>>tc;
rep(i,tc){
solve();
}
}
컴파일 시 표준 에러 (stderr) 메시지
virus.cpp: In function 'int32_t main()':
virus.cpp:136:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
136 | freopen(task".inp","r",stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
virus.cpp:137:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
137 | freopen(task".out","w",stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |