【u233】单词化简

来源:互联网 发布:king of the hill知乎 编辑:程序博客网 时间:2024/04/28 10:23

Time Limit: 1 second
Memory Limit: 64 MB

【问题描述】

最近情报人员得到了一些经过加密的文章,每个单词都很长。破译人员想到先把单词化简一下,方法是把每个单词尽量取短些的前缀,但所取的前缀不能是其他单词的前缀。 这个任务现在就交给你来完成。 解释:“字符串s1是s2的前缀”是说把字符串s2的后面去掉某些,只保留与s1相同长度是,s2就与s1完全相同。如:“abc“是”abcaade“和”abc“的前缀,但不是”abadc“的前缀。 数据范围 单词数N,1<=n<=50; 每个单词长度不超过50;并且都是由小写字母构成。 保证所给单词没有一个单词是另一个单词的前缀。

【输入格式】

第一行一个整数N,表示单词的个数。 下面有N行,每行一个单词。

【输出格式】

共N行,每行一个单词,是对应上面N个单词化简后的单词。

【数据规模】

Sample Input1

3
abc
efg
ijh

Sample Output1

a
e
i

Sample Input2

3
aac
aad
aae

Sample Output2

aac
aad
aae

【题目链接】:http://noi.qz5z.com/viewtask.asp?id=u233

【题解】

如果s1比s2长,s1不是s2的前缀;
枚举字符的前缀是什么(从短到长);然后看看是不是其他的字符串的前缀;

【完整代码】

#include <cstdio>#include <cstdlib>#include <cmath>#include <set>#include <map>#include <iostream>#include <algorithm>#include <cstring>#include <queue>#include <vector>#include <stack>#include <string>using namespace std;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define LL long long#define rep1(i,a,b) for (int i = a;i <= b;i++)#define rep2(i,a,b) for (int i = a;i >= b;i--)#define mp make_pair#define pb push_back#define fi first#define se secondtypedef pair<int,int> pii;typedef pair<LL,LL> pll;void rel(LL &r){    r = 0;    char t = getchar();    while (!isdigit(t) && t!='-') t = getchar();    LL sign = 1;    if (t == '-')sign = -1;    while (!isdigit(t)) t = getchar();    while (isdigit(t)) r = r * 10 + t - '0', t = getchar();    r = r*sign;}void rei(int &r){    r = 0;    char t = getchar();    while (!isdigit(t)&&t!='-') t = getchar();    int sign = 1;    if (t == '-')sign = -1;    while (!isdigit(t)) t = getchar();    while (isdigit(t)) r = r * 10 + t - '0', t = getchar();    r = r*sign;}const int MAXN = 50+10;const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};const double pi = acos(-1.0);string s[MAXN];int n;bool f(string s1,string s2){    int len1=s1.size(),len2 = s2.size();    if (len1>len2)        return false;    len1 = min(len1,len2);    rep1(i,0,len1-1)        if (s1[i]!=s2[i])            return false;    return true;}int main(){    //freopen("F:\\rush.txt","r",stdin);    scanf("%d",&n);    rep1(i,1,n)        cin >> s[i];    rep1(i,1,n)    {        int len = s[i].size();        int k = 1;        while (k <= len)        {            string s1 = s[i].substr(0,k);            bool is = false;            rep1(j,1,n)                if (i!=j)                {                    if (f(s1,s[j]))                    {                        is = true;                        break;                    }                }            if (!is)            {                cout << s1<<endl;                break;            }            k++;        }    }    return 0;}
0 0