题解:P1098 [NOIP2007 提高组] 字符串的展开

· · 题解

这道题模拟一下,两个给出的数据基本可以判断代码的正确性,但有可能是 60 分,原因有可能是只在循环外求了 string 类的长度。

这道题的判断条件比较多,如果用 if...else 写的话代码会比较长,但是比较容易理解。

根据题目意思写就行,用到了 string 类的一些用法,可以上官网查,当然也可以用字符数组。

AC Code

#include <bits/stdc++.h>
using namespace std;
string s;
int main()
{
    int p1,p2,p3;
    cin>>p1>>p2>>p3;
    cin>>s;
    int len=s.size();
    for (int i=0; i<len; i++)
    {
        len=s.size();//注意更新!!!
        if (i!=0 && i!=len-1 && s[i]=='-')//判断"-",边界
            if (s[i-1]>='0' && s[i-1]<='9' && s[i+1]>='0' && s[i+1]<='9' && s[i+1]>s[i-1])
            {
                int x=i,l=int(s[i-1])+1,r=int(s[i+1]);
                s.erase(i, 1);//擦去"-"
                if (p1==3)
                    for (int j=l; j<r; j++)//正序(与赋值的对应)
                        for (int g=0; g<p2; g++)
                        {
                            s.insert(x,"*");
                            x++;//更新添加位置
                        }
                else if (p1==1 || p1==2)
                    if (p3==1)
                        for (int j=l; j<r; j++)
                            for (int g=0; g<p2; g++)
                            {
                                s.insert(x,1,char(j));
                                x++;
                            }
                    else if (p3==2)
                        for (int j=r-1; j>=l; j--)//逆序(与赋值的对应)
                            for (int g=0; g<p2; g++)
                            {
                                s.insert(x,1,char(j));
                                x++;
                            }
            }
            else if (s[i-1]>='a' && s[i-1]<='z' && s[i+1]>='a' && s[i+1]<='z' && s[i+1]>s[i-1])
            {
                int x=i,l=int(s[i-1])+1,r=int(s[i+1]);
                s.erase(i, 1);
                if (p1==3)
                    for (int j=l; j<r; j++)
                        for (int g=0; g<p2; g++)
                        {
                            s.insert(x,"*");//添加字符数组类const char*
                            x++;
                        }
                else if (p1==1)
                {
                    if (p3==1)
                        for (int j=l; j<r; j++)
                            for (int g=0; g<p2; g++)
                            {
                                s.insert(x,1,char(j));//添加单个字符char
                                x++;
                            }
                    else if (p3==2)
                        for (int j=r-1; j>=l; j--)
                            for (int g=0; g<p2; g++)
                            {
                                s.insert(x,1,char(j));
                                x++;
                            }
                }
                else if (p1==2)
                    if (p3==1)
                        for (int j=l; j<r; j++)
                            for (int g=0; g<p2; g++)
                            {
                                s.insert(x,1,char(j-int('a')+int('A')));
                                x++;
                            }
                    else if (p3==2)
                        for (int j=r-1; j>=l; j--)
                            for (int g=0; g<p2; g++)
                            {
                                s.insert(x,1,char(j-int('a')+int('A')));//变成大写
                                x++;
                            }
            }
    }
    cout<<s;
    return 0;
}

End