제출 #261408

#제출 시각아이디문제언어결과실행 시간메모리
261408limabeans바이러스 (JOI19_virus)C++17
0 / 100
2082 ms94468 KiB
#include <bits/stdc++.h>
using namespace std;

template<typename T>
void out(T x) { cout << x << endl; exit(0); }
#define watch(x) cout << (#x) << " is " << (x) << endl





using ll = long long;

const ll mod = 1e9+7;
const int maxn = 801;
const int inf = 2e9;


int m,r,c;
string s;
vector<vector<int>> g;
const string dir = "NSEW";
int ls[25];

map<char,int> X;

int sim(int x, int y) {
    int n = g.size();
    int m = g[0].size();

    
    map<int,set<int>> mp; // mask->coords
    map<int,int> state; //coord->mask
    
    for (int i=0; i<n; i++) {
	for (int j=0; j<m; j++) {
	    mp[0].insert(i*m+j);
	    state[i*m+j]=0;
	}
    }

    auto get = [&](int i, int j) {
	return i*m+j;
    };

    int infected = 0;

    // i,j is infected, edit the neighbor states
    auto add = [&](int i, int j) {
	infected++;
	int msk=-1, msk2=-1;
	if (i-1>=0) {
	    int nei = get(i-1,j);
	    if (state.count(nei)) {
		msk=state[nei];
		msk2 = msk | (1<<X['S']);
		mp[msk].erase(nei);
		state[nei]=msk2;
		mp[msk2].insert(nei);
	    }
	}
	if (i+1<n) {
	    int nei = get(i+1,j);
	    if (state.count(nei)) {
		msk=state[nei];
		msk2 = msk | (1<<X['N']);
		mp[msk].erase(nei);
		state[nei]=msk2;
		mp[msk2].insert(nei);
	    }
	}
	if (j+1<m) {
	    int nei = get(i,j+1);
	    if (state.count(nei)) {
		msk=state[nei];
		msk2 = msk | (1<<X['W']);
		mp[msk].erase(nei);
		state[nei]=msk2;
		mp[msk2].insert(nei);
	    }
	}
	if (j-1>=0) {
	    int nei = get(i,j-1);
	    if (state.count(nei)) {
		msk=state[nei];
		msk2 = msk |(1<<X['E']);
		mp[msk].erase(nei);
		state[nei]=msk2;
		mp[msk2].insert(nei);
	    }
	}
    };
    mp[0].erase(x*m+y);
    state.erase(x*m+y);
    add(x,y);

    // for (auto p: state) {
    // 	cout<<p.first<<": "<<bitset<4>(p.second)<<endl;
    // }

    while (true) {
	bool ed = false;
	for (auto p: mp) {
	    int mask = p.first;
	    vector<int> v;
	    for (int dat: p.second) {
		int r=dat/m;
		int c=dat%m;
		if (g[r][c] > 0 && ls[mask] >= g[r][c]) {
		    v.push_back(dat);			
		}
	    }
	    if (v.size()) {
		for (int dat: v) {
		    mp[mask].erase(dat);
		    state.erase(dat);
		    add(dat/m,dat%m);
		}
		ed = true;
		break;
	    }
	}
	if (!ed) break;
    }


    return infected;
}

int main() {
    ios_base::sync_with_stdio(false); cin.tie(0);  cout.tie(0);
    for (int i=0; i<4; i++) X[dir[i]]=i;

    cin>>m>>r>>c;
    g = vector<vector<int>>(r, vector<int>(c));
    cin>>s;
    for (int i=0; i<r; i++) {
	for (int j=0; j<c; j++) {
	    cin>>g[i][j];
	}
    }

    s += s;

    for (int mask=1; mask<16; mask++) {
	int len = s.length();
	set<char> st;
	for (int j=0; j<4; j++) {
	    if (mask>>j&1) st.insert(dir[j]);
	}
	bool all = true;
	for (int i=0; i<len; i++) {
	    if (!st.count(s[i])) {
		all=false;
		break;
	    }
	}
	if (all) {
	    ls[mask]=inf;
	    continue;
	}

	int best = 0;
	for (int i=0; i<len; ) {
	    if (!st.count(s[i])) {
		i++;
		continue;
	    }
	    int j=i;
	    while (j<len && st.count(s[j])) {
		j++;
	    }
	    best = max(best, j-i);
	    i=j;
	}

	ls[mask] = best;
    }


    map<int,int> mp;

    for (int i=0; i<r; i++) {
	for (int j=0; j<c; j++) {
	    if (g[i][j] > 0) {
		int cur = sim(i,j);
		//cout<<i+1<<","<<j+1<<": "<<cur<<endl;
		mp[cur]++;
	    }
	}
    }

    cout<<mp.begin()->first<<endl;
    cout<<mp.begin()->second<<endl;
    
    
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...