1. 程式人生 > >Codeforces Round #486 (Div. 3) B Substrings Sort

Codeforces Round #486 (Div. 3) B Substrings Sort

重新 輸出 out 規則 != can 判斷 http AS

題目鏈接:https://vjudge.net/contest/234309#problem/C

題目大意:

給你n個字符串,每個字符串都是有小寫字母組成的。重新給這些字符串
排序按照以下規則:每個字符串的前面都是它的子串
如果在b中選擇連續的字母可以組成a,則稱a是b的子串。比如字符串“for”
是“codeforces”的子串,“for”是“therefore”的子串,但是沒有子串“four”“fofo”和“rof”。
輸入:
第一行是一個整數n(字符串的數量)
下面的n行是給你的字符串。字符串的長度為1到100。每個字符串
由小寫字母組成。
一些字符串可能是相同的。
輸出:
如果重新排序後可以不可能滿足要求的序列就輸出“NO”(沒有引號)。
否則輸出“YES”和n行要求的字符串的序列。
提示:在第二個樣例中,你不可以重新排序“abab”使它為“abacaba”的子串。

#include <string>
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;

bool cmpp(string a, string b)                //註意要按題意將字符串排序
{
    if (a.length() == b.length())
        return a < b;
    return a.length() < b.length();
}

int main() { int n; while (scanf("%d", &n) != EOF) { string str[110]; for (int i = 0; i < n; i++) cin >> str[i]; sort(str, str + n,cmpp); map<string, int>mapp; int flag = 0; for (int i = 1; i < n&&!flag; i++) //
判斷第i個字符串是否符合題意 { mapp.clear(); //記住每次要清空map for (int j = 0; j < i&&!flag; j++) //遍歷前i-1個字符串是否為第i個字符串的字串 { int len = str[j].length(); //第j個字符串的長度 for (int k = 0; k <= str[i].length() - len; k++) { mapp[str[i].substr(k, len)]++; //標記第i個string中起點為0~str[i].length() - len的,長度為len的string } if (mapp[str[j]] == 0)flag = 1; //如果str[j]未被標記,這說明str[j]不為str[i]的字串 } } if (flag)printf("NO\n"); else { printf("YES\n"); for (int i = 0; i < n; i++) cout << str[i] << endl; } } return 0; }

2018-06-14

Codeforces Round #486 (Div. 3) B Substrings Sort