답안 #93961

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
93961 2019-01-13T18:44:38 Z updown1 Rima (COCI17_rima) C++17
112 / 140
1000 ms 77588 KB
/*
The length decreases and then increases
for every node, count everything with the same suffix
dp[node] = (increasing sequence) max length sequence starting from this node ( but not counting count[node] or this node )
try every length as the smallest length
answer is max(big1[len]+big2[len]+count[word] where big1 an big2 have the same suffix,
             1 + big1 + big2 + count[word])
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define For(i, a, b) for(int i=a; i<b; i++)
#define ffi For(i, 0, N)
#define ffj For(j, 0, M)
#define ffa ffi ffj
#define s <<" "<<
#define c <<" : "<<
#define w cout
#define e "\n"
#define pb push_back
#define mp make_pair
#define a first
#define b second
//#define int ll
const int MAXN=500000, INF=1000000000;
///500,000,000
int N, dp[MAXN], out;
string inp[MAXN], sm[MAXN];
bool vis[MAXN];
map<string, vector<int> > cnt; /// (suffix, vector<index> )

void go(int at) {
    if (vis[at]) return;
    vis[at] = true;
    int siz = cnt[inp[at]].size();
    for (int i: cnt[inp[at]]) {
        go(i);
        dp[at] = max(dp[at], dp[i]+siz);
    }
    //w<< inp[at] s (int)(cnt[inp[at]].size())<<e;
}

main() {
    //ifstream cin("test.in");
	ios_base::sync_with_stdio(0); cin.tie(0);
	cin >> N;
	ffi {
	    cin >> inp[i];
	    sm[i] = inp[i].substr(1);
	    cnt[sm[i]].pb(i);
	}
	ffi go(i);
	//ffi w<< inp[i] c dp[i]<<e;
	ffi vis[i] = false;
	ffi if (!vis[i]) {
        string use = sm[i];
        int big1 = 0, big2 = 0;
        int siz = cnt[use].size();
        for (int j: cnt[use]) {
            big2 = max(big2, dp[j]);
            if (big2 > big1) swap(big2, big1);
            vis[j] = true;
        }
        out = max(out, big1+big2+siz);
        if (siz == 1) {
            big1 = big2 = 0;
            for (int j: cnt[inp[i]]) {
                big2 = max(big2, dp[j]);
                if (big2 > big1) swap(big2, big1);
            }
            //if (i == 3) w<< big1 s big2 s (int)cnt[inp[i]].size()<<e;
            out = max(out, 1+big1+big2+(int)cnt[inp[i]].size());
        }
	}
	w<< out<<e;
}

Compilation message

rima.cpp:43:6: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
 main() {
      ^
# 결과 실행 시간 메모리 Grader output
1 Correct 29 ms 31608 KB Output is correct
2 Correct 29 ms 31608 KB Output is correct
3 Correct 29 ms 31608 KB Output is correct
4 Execution timed out 1075 ms 77588 KB Time limit exceeded
5 Correct 59 ms 40668 KB Output is correct
6 Correct 35 ms 34544 KB Output is correct
7 Incorrect 35 ms 34076 KB Output isn't correct
8 Correct 34 ms 33752 KB Output is correct
9 Correct 95 ms 43644 KB Output is correct
10 Correct 36 ms 33792 KB Output is correct