Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //touch {a..m}.in; tee {a..m}.cpp < template.cpp
- #include <bits/stdc++.h>
- using namespace std;
- #define forr(i,a,b) for(int i=(a); i<(b); i++)
- #define forn(i,n) forr(i,0,n)
- #define sz(c) ((int)c.size())
- #define zero(v) memset(v, 0, sizeof(v))
- #define forall(it,v) for(auto it=v.begin();it!=v.end();++it)
- #define pb push_back
- #define fst first
- #define snd second
- typedef long long ll;
- typedef pair<int,int> ii;
- #define dforn(i,n) for(int i=n-1; i>=0; i--)
- #define dprint(v) cout << #v"=" << v << endl //;)
- #define INF (1e18+1)
- #define N 100
- #define M 20
- map <string, int> mapi;
- vector <int> v[N*M];
- bool cmp (vector <int> v1, vector <int> v2){
- forn (i, (int)v1.size()){
- if (v1[i] < v2[i]) return true;
- if (v1[i] > v2[i]) return false;
- }
- return false;
- }
- bool puedenSerNombres (vector <int> v1, vector <int> v2){
- forn (i, (int)v1.size()){
- if (!(v1[i] ^ v2[i])) return false;
- }
- return true;
- }
- bool todosUnos (vector <int> v){
- forn (i, (int)v.size())
- if (!v[i]) return false;
- return true;
- }
- int main(){
- int n,m;
- cin >> n >> m;
- int contador = 0;
- forn (i,n) forn (j,m){
- string s;
- cin >> s;
- if (mapi.count(s) == 0){
- v[contador].resize(n);
- mapi[s] = contador++;
- }
- int number = mapi[s];
- v[number][i] = 1;
- }
- sort(v,v+contador, cmp);
- int i = 0, j = contador - 1;
- bool rta = true;
- while (i <= j){
- if (todosUnos (v[j])) {
- j--;
- }
- else if (puedenSerNombres (v[i], v[j])){
- i++;
- j--;
- }
- else{
- rta = false;
- break;
- }
- }
- cout << (rta?'S':'N') << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement