I18n

I18n

这里写图片描述
题意:给一个字符串,其中有一些缩写,即两个字符之间加一个数字k,代表特定两个字符开头结尾,其中中间有k个字符被简略掉,如果收到当前位置,前面出现过满足这样条件的单词,那么就输出该单词,否则直接输出
解法:暴力,这题并不难,但注意有些陷阱,首先就是大小写,判断该缩写是否出现过并不会判断大小写,如果出现过,那么分几点:假设出现了apple,那么缩写A3e就要输出Apple,如果A3E就要输出APPLE,如果前面出现多个满足的,那么就判定为矛盾,直接输出,譬如有son和sun,那么出现s1n就直接输出s1n。

#include <iostream>
using namespace std;
#include <cstring>
#include <stdio.h>
#include <stdlib.h>

char data[80010][100], c, s[100], temp[100];
int a[80010] = {0};
int n, m, num, tempn, tempm;

bool isnum(char c) {
    return (c >= '0' && c <= '9');
}

bool islet(char c) {
    return ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'));
}

bool isup(char c) {
    return (c >= 'A' && c <= 'Z');
}

bool islow(char c) {
    return (c >= 'a' && c <= 'z');
}

bool equal(char x, char y) {
    if (x == y) return true;
    if (x-'A'+'a' == y) return true;
    if (x-'a'+'A' == y) return true;
    return false;
}

int main() {
    freopen("i18n.in","r",stdin);
    freopen("i18n.out","w",stdout);
    m = 0;
    num = 0;
    while (scanf("%c", &c) != EOF) {
        if (isnum(c) || islet(c)) {
            s[m++] = c;
            if (isnum(c)) num++;
        } else {
            if (m > 0) {
                if (m == 3 && islet(s[0]) && isnum(s[1]) && islet(s[2]) && s[1] != '0') {
                    int t = s[1]-'0', x = 0, y = 0;
                    tempn = 0; tempm = 0;
                    for (int i = 1; i <= n; i++) {
                        if (a[i] == t+2 && equal(s[0], data[i][0]) && equal(s[2], data[i][t+1])) {
                            if (isup(s[0])) x = 1;
                            if (isup(s[2])) y = 1;
                            for (int j = 0; j < a[i]; j++)
                                temp[j] = data[i][j];
                            if (y == 1) {
                                for (int j = 0; j < a[i]; j++)
                                    temp[j] = temp[j]-'a'+'A';
                            } else if (x == 1) {
                                temp[0] = temp[0]-'a'+'A';
                            }
                            tempm = a[i];
                            tempn++;
                        }
                    }
                    if (tempn == 1) {
                        m = tempm;
                        for (int i = 0; i < m; i++) s[i] = temp[i];
                    }
                    for (int i = 0; i < m; i++)
                        printf("%c", s[i]);
                    m = 0;
                    num = 0;
                } else if (m == 4 && islet(s[0]) && isnum(s[1]) && isnum(s[2]) && islet(s[3]) && s[1] != '0'){
                    int t = (s[1]-'0')*10+s[2]-'0';
                    int x = 0, y = 0;
                    tempn = 0; tempm = 0;
                    for (int i = 1; i <= n; i++) {
                        if (a[i] == t+2 && equal(s[0], data[i][0]) && equal(s[3], data[i][t+1])) {
                            if (isup(s[0])) x = 1;
                            if (isup(s[3])) y = 1;
                            for (int j = 0; j < a[i]; j++)
                                temp[j] = data[i][j];
                            if (y == 1) {
                                for (int j = 0; j < a[i]; j++)
                                    temp[j] = temp[j]-'a'+'A';
                            } else if (x == 1) {
                                temp[0] = temp[0]-'a'+'A';
                            }
                            tempm = a[i];
                            tempn++;
                        }
                    }
                    if (tempn == 1) {
                        m = tempm;
                        for (int i = 0; i < m; i++) s[i] = temp[i];
                    }
                    for (int i = 0; i < m; i++)
                        printf("%c", s[i]);
                    m = 0;
                    num = 0;
                } else {
                    for (int i = 0; i < m; i++) printf("%c", s[i]);
                    if (num == 0) {
                        for (int i = 0; i < m; i++) if (isup(s[i])) {
                            s[i] = s[i]-'A'+'a';
                        }
                        bool flag = false;
                        for (int i = 1; i <= n; i++) if (a[i] == m) {
                            flag = true;
                            for (int j = 0; j < m; j++) if (data[i][j] != s[j]) {
                                flag = false; break;
                            }
                            if (flag) break;
                        }
                        if (!flag) {
                            n++;
                            for (int i = 0; i < m; i++)
                                data[n][i] = s[i];
                            a[n] = m;
                        }
                    }
                    num = 0;
                    m = 0;
                }
            }
            printf("%c", c);
        }
    }
    //
        if (m > 0) {
                if (m == 3 && islet(s[0]) && isnum(s[1]) && islet(s[2]) && s[1] != '0') {
                    int t = s[1]-'0', x = 0, y = 0;
                    tempn = 0; tempm = 0;
                    for (int i = 1; i <= n; i++) {
                        if (a[i] == t+2 && equal(s[0], data[i][0]) && equal(s[2], data[i][t+1])) {
                            if (isup(s[0])) x = 1;
                            if (isup(s[2])) y = 1;
                            for (int j = 0; j < a[i]; j++)
                                temp[j] = data[i][j];
                            if (y == 1) {
                                for (int j = 0; j < a[i]; j++)
                                    temp[j] = temp[j]-'a'+'A';
                            } else if (x == 1) {
                                temp[0] = temp[0]-'a'+'A';
                            }
                            tempm = a[i];
                            tempn++;
                        }
                    }
                    if (tempn == 1) {
                        m = tempm;
                        for (int i = 0; i < m; i++) s[i] = temp[i];
                    }
                    for (int i = 0; i < m; i++)
                        printf("%c", s[i]);
                    m = 0;
                    num = 0;
                } else if (m == 4 && islet(s[0]) && isnum(s[1]) && isnum(s[2]) && islet(s[3]) && s[1] != '0'){
                    int t = (s[1]-'0')*10+s[2]-'0';
                    int x = 0, y = 0;
                    tempn = 0; tempm = 0;
                    for (int i = 1; i <= n; i++) {
                        if (a[i] == t+2 && equal(s[0], data[i][0]) && equal(s[3], data[i][t+1])) {
                            if (isup(s[0])) x = 1;
                            if (isup(s[3])) y = 1;
                            for (int j = 0; j < a[i]; j++)
                                temp[j] = data[i][j];
                            if (y == 1) {
                                for (int j = 0; j < a[i]; j++)
                                    temp[j] = temp[j]-'a'+'A';
                            } else if (x == 1) {
                                temp[0] = temp[0]-'a'+'A';
                            }
                            tempm = a[i];
                            tempn++;
                        }
                    }
                    if (tempn == 1) {
                        m = tempm;
                        for (int i = 0; i < m; i++) s[i] = temp[i];
                    }
                    for (int i = 0; i < m; i++)
                        printf("%c", s[i]);
                    m = 0;
                    num = 0;
                } else {
                    for (int i = 0; i < m; i++) printf("%c", s[i]);
                    if (num == 0) {
                        for (int i = 0; i < m; i++) if (isup(s[i])) {
                            s[i] = s[i]-'A'+'a';
                        }
                        bool flag = false;
                        for (int i = 1; i <= n; i++) if (a[i] == m) {
                            flag = true;
                            for (int j = 0; j < m; j++) if (data[i][j] != s[j]) {
                                flag = false; break;
                            }
                            if (flag) break;
                        }
                        if (!flag) {
                            n++;
                            for (int i = 0; i < m; i++)
                                data[n][i] = s[i];
                            a[n] = m;
                        }
                    }
                    num = 0;
                    m = 0;
                }
            }
    fclose(stdin);fclose(stdout);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值