P1098 [NOIP2007 提高组] 字符串的展开
题解
本题还是一道模拟题,但是各种条件比较多,很繁琐。我个人的处理思路就是遇到’-'的时候调用expendStr()函数处理,首先计算需要填充的长度,然后填充到tmp中,再根据三个展开条件具体进行。
比较坑的一点是用例很长(刚开始没考虑到最后的长度会那么长,只开了1000位,结果后几个样例都是因为数组越界导致错误的。(不知道为什么提交是wa而不是re))
#include <iostream>
#include <cstdio>
#include <cstring>
int p, q, t;
int expendStr(char str[], int len, char st, char ed)
{
if (st == ed)
{
str[len++] = '-';
return len;
}
if ((st >= '0' && ed >= '0' && st <= '9' && ed <= '9') || (st >= 'a' && st <= 'z' && ed >= 'a' && ed <= 'z'))//数字
{
int count = ed - st - 1;
if (ed - st < 0)
{
str[len++] = '-';
return len;
}
char tmp[1000] = { '\0' };
int tLen = 0;
//先把需要填充的写入到tmp中
for (int i = 1; i <= count; i++)
{
for (int j = 0; j < q; j++)
{
if (p == 3)
tmp[tLen++] = '*';
else
tmp[tLen++] = st + i;
}
}
if (t == 1)
{
for (int i = 0; i < tLen; i++)
{
str[len++] = tmp[i];
}
}
else
{
for (int i = tLen - 1; i >= 0; i--)
{
str[len++] = tmp[i];
}
}
if (st >= 'a' && st <= 'z' && ed >= 'a' && ed <= 'z' && p == 2)
{
for (int i = len - tLen; i < len; i++)
{
str[i] = str[i] - ('a' - 'A');
}
}
}
else
{
str[len++] = '-';
return len;
}
return len;
}
int dealStr(char org[], int len, char ans[])
{
int aLen = 0;
for (int i = 0; i < len; i++)
{
char ch = org[i];
if (ch != '-')
{
ans[aLen++] = ch;
}
else if (ch == '-' && i == 0 || i == len - 1)
{
ans[aLen++] = ch;
}
else
{
aLen = expendStr(ans, aLen, org[i - 1], org[i + 1]);
}
}
return aLen;
}
int main()
{
char str[9001] = { 0 };
char ans[9001] = { 0 };
int len;
int ansLen;
//p = 1 小写填充,p = 2大写填充,p = 3用*填充
//q 每个字母/数字的填充个数
//t = 1 顺序填充 t = 2逆序填充
scanf("%d %d %d", &p, &q, &t);
scanf("%s", str);
len = strlen(str);
ansLen = dealStr(str, len, ans);
for (int i = 0; i < ansLen; i++)
{
printf("%c", ans[i]);
}
printf("\n");
}