UVA 4879 Old Fafhioned Typefetting(易WA细节题)

欢迎访问https://blog.csdn.net/lxt_Lucia~~

宇宙第一小仙女\(^o^)/~萌量爆表求带飞=≡Σ((( つ^o^)つ~ dalao们点个关注呗~

 

--------------------------------我只是一条可爱哒分界线-------------------------------

 

一、问题:

Description

In Olden Days, before digital typesetting (before Babbage, even), typesetting was an art, practiced by highly skilled craftsmen. Certain character combinations, such as a-e or f-i were typeset as a single character, called a ligature, to save space and to make the characters look better together on the printed page (the ligatures for a-e and f-i were `a e' and `f i', respectively; the table on the next page, lists all possible ligature combinations).
In addition, there were two different versions of the lowercase letter s: the ``long s" (ß) and the ``short s". Only the short s is used today. The rules for when to use which version are odd, but straightforward:

 

  1. Short s is used at the end of a word, or before punctuation within a word, such as a hyphen or apostrophe: programs, success, hocus-pocus, revis'd. (programs, ßucceßs, hocus-pocus, revis'd)
  2. Short s is used before the letters `f', `b', or `k': transfer, husband, ask, successful. (transfer, husband, ask, ßucceßsful)
  3. Long s is used everywhere else, except...
  4. It is possible that a compound word consists of a word ending in a double s followed by a word beginning with s (this is the only situation where the sequence ``sss" occurs in English text). In this case, the middle s is set short and the other two are set long: crossstitch, crossstaff. (croßsßtitch, croßsßaf f)

Note that a “word” is not the same thing as an “identifier.” While identifiers can contain punctuation marks such as ‘ ’ or ‘$’, words can contain only letters (at least as far as typographers are concerned). Therefore, identifiers like “radius3” and “ adios amigo” would be typeset as “radius3” and “adios amigo,” respectively, rather than “radiuß3” and “adioß amigo.”

 

Input

The first line of input contains a single integer P (1 ≤ P ≤ 1000), which is the number of data sets that follow. Each data set consists of a single line containing the data set number, followed by a space, followed by a string of no more than 1000 characters.

 

Output

For each data set, print the data set number, a space, and the input string, with the appropriate ligature and ``long s" codes substituted into the string.
The table on the next page shows the code strings to use for each symbol or ligature (note that the short s remains unchanged on output; note also that `A E' and `O E' are the only uppercase ligatures):

Note that the rules for the use of long and short s can combine with these ligatures in interesting (and not always obvious) ways. For example, the input word ‘crossstitch’ becomes ‘cro[longs]s[longst]itch’, not ‘cro[longs]s[longs]titch’.

 

Sample Input

3 
1 Last night, we went to see 
2 "Oedipus Rex" at the 
3 AEgyptian's theater.

 

Sample Output

1 La[longst] night, we went to [longs]ee 
2 "[OE]dipus Rex" at the 
3 [AE]gyptian's theater.

 

二、题意:

对于每组样例给出的串,按照相应要求进行对应的变换。

 

三、思路:

特殊情况是真 tm 多啊这题... WA了好几发...

注意:

1)AE / Ae / aE,都要转换为[AE]输出,但ae要转换成[ae];

同理: OE / Oe / oE,都要转换为[OE]输出,但oe要转换成[oe]。(如样例2)。

2)特殊的s,关键就在s的处理上了。。

首先,sss的情况,按照中间的是short s,两边的是long s处理。

其次,si / sh / sl / st / ss / ssi的情况,这里边的s都要是long s才可以合并。

然后,每个单词末尾的s,或者s后面紧跟着 f / b / k 的按short s处理。

还有,它说的 word 和 identifier 的区别,判断特殊字符用 a[ i ] < 'a'  ||  a[ i ] > 'z'就可以。

3)另外还要注意,在找是否可以合并的时候,不要数组越界。

4)还有.... 循环里也有i++,不要移多了...

 

我的思路是:

先开一个 vis 数组,把long s对应的标记为1,short s 不作处理。

然后先从是否可以3个一起合并开始判,可以合并的话把下标往后移然后直接continue,不能合并了3个的再合并两个的。

如果3个的不能合并再判两个能合并的,也不能合的话就直接输出这个字符 (如果是s再判是不是long s)。

 

四、代码:

#include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define read(x) scanf("%d",&x)
#define mem(a,b) memset(a,0,sizeof(a))
#define fori(a,b) for(int i=a;i<=b;i++)
#define forj(a,b) for(int j=a;j<=b;j++)
#define fork(a,b) for(int k=a;k<=b;k++)

using namespace std;
typedef long long LL;

int main()
{
    int T, k;
    char a[1010];
    bool vis[1010];
    read(T);
    while(T--)
    {
        mem(vis,0);
        read(k);
        getchar();
        gets(a);
        int len = strlen(a);
        printf("%d ",k);
        fori(0, len-1)
        {
            bool flag = 0;
            if(a[i] == 's')
            {
                if(i+1 <= len-1)
                {
                    if(a[i+1] == ' '|| a[i+1] == 'f' || a[i+1] == 'b' || a[i+1] == 'k' || a[i+1] < 'a' || a[i+1] > 'z')
                        flag = 1;
                }
                else if(i == len-1)
                    flag = 1;
                if(!flag)
                    vis[i] = 1;
            }
        }
        fori(0, len-1)
        {
            if(i+2 <= len-1)
            {
                if(a[i] == 's' && a[i+1] == 's' && a[i+2] == 's')
                {
                    printf("[longs]s");
                    i++;
                    continue;
                }
                else if(a[i] == 's' && vis[i] && a[i+1] == 's' && vis[i+1] && a[i+2] == 'i')
                {
                    printf("[longssi]");
                    i += 2;
                    continue;
                }
                else if(a[i] == 'f' && a[i+1] == 'f' && a[i+2] == 'l')
                {
                    printf("[ffl]");
                    i += 2;
                    continue;
                }
                else if(a[i] == 'f' && a[i+1] == 'f' && a[i+2] == 'i')
                {
                    printf("[ffi]");
                    i += 2;
                    continue;
                }
            }
            if(i+1 <= len-1)
            {
                if((a[i] == 'A' && a[i+1] == 'E') || (a[i] == 'A' &&a[i+1] == 'e') || (a[i] == 'a' &&a[i+1] == 'E'))
                {
                    printf("[AE]");
                    ++i;
                    continue;
                }
                else if(a[i]=='a' && a[i+1]=='e')
                {
                    printf("[ae]");
                    ++i;
                    continue;
                }
                else if((a[i]=='O' && a[i+1]=='E') || (a[i]=='O' && a[i+1]=='e') || (a[i] == 'o' && a[i+1] == 'E'))
                {
                    printf("[OE]");
                    ++i;
                    continue;
                }
                else if(a[i] == 'o' && a[i+1] == 'e')
                {
                    printf("[oe]");
                    ++i;
                    continue;
                }
                else if(a[i] == 'c' && a[i+1] == 't')
                {
                    printf("[ct]");
                    ++i;
                    continue;
                }
                else if(a[i] == 'f' && a[i+1] == 'f')
                {
                    printf("[ff]");
                    ++i;
                    continue;
                }
                else if(a[i] == 'f' && a[i+1] == 'i')
                {
                    printf("[fi]");
                    ++i;
                    continue;
                }
                else if(a[i] == 'f' && a[i+1] == 'l')
                {
                    printf("[fl]");
                    ++i;
                    continue;
                }
                else if(a[i] == 's' && vis[i] && a[i+1] == 'i')
                {
                    printf("[longsi]");
                    ++i;
                    continue;
                }
                else if(a[i] == 's' && vis[i] && a[i+1] == 'h')
                {
                    printf("[longsh]");
                    ++i;
                    continue;
                }
                else if(a[i] == 's' && vis[i] && a[i+1] == 'l')
                {
                    printf("[longsl]");
                    ++i;
                    continue;
                }
                else if(a[i] == 's' && vis[i] && vis[i+1] && a[i+1] == 's')
                {
                    printf("[longss]");
                    ++i;
                    continue;
                }
                else if(a[i] == 's' && vis[i] && a[i+1] == 't')
                {
                    printf("[longst]");
                    ++i;
                    continue;
                }
            }
            if(a[i] == 's')
            {
                if(vis[i])
                    printf("[longs]");
                else
                    printf("s");
            }
            else
                printf("%c",a[i]);
        }
        printf("\n");
    }
    return 0;
}

 

--------------------------------我也是有底线的---------------------------------

宇宙第一小仙女\(^o^)/~萌量爆表求带飞=≡Σ((( つ^o^)つ~ dalao们点个关注呗~

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值