T31 字符串P型编码
描述
给定一个完全由数字字符('0','1','2',…,'9')构成的字符串str,请写出str的p型编码串。例如:字符串122344111可被描述为"1个1、2个2、1个3、2个4、3个1",因此我们说122344111的p型编码串为1122132431;类似的道理,编码串101可以用来描述1111111111;00000000000可描述为"11个0",因此它的p型编码串即为110;100200300可描述为"1个1、2个 0、1个2、2个0、1个3、2个0",因此它的p型编码串为112012201320。
输入
输入仅一行,包含字符串str。每一行字符串最多包含1000个数字字符。
输出
输出该字符串对应的p型编码串。
样例输入
122344111
样例输出
1122132431
1 #include
2 #include
3 using namespace std;
4 char a[1001];
5 int s;
6 int main()
7 {
8 cin>>a;
9 int q;
10 for(q=0;q
11 if(a[q]!=a[q+1]) break;
12 else s++;
13 s++;//当break时,由于比较的是q和q+1,第q个与第q-1个是相等的所以s+1
14 if(s==strlen(a))//整个串只有一种的情况
15 {
16 cout<0];
17 return 0;
18 }
19 for(int i&#61;q&#43;1;i
20 {
21 if(a[i]&#61;&#61;a[i-1]) s&#43;&#43;;
22 else
23 {
24 cout<1];//因为比较的是i和 i-1&#xff0c;输出i-1的情况&#xff0c;所以最后一种在循环里无法输出
25 s&#61;1;//不相等时&#xff0c;自己本身有长度为1&#xff0c;所以s不是0
26 }
27 }
28 cout<1];//输出最后一种
29 }
T32 行程长度编码
描述
在数据压缩中&#xff0c;一个常用的途径是行程长度压缩。对于一个待压缩的字符串而言&#xff0c;我们可以依次记录每个字符及重复的次数。这种压缩&#xff0c;对于相邻数据重复较多的情况比较有效。 例如&#xff0c;如果待压缩串为"AAABBBBCBB"&#xff0c;则压缩的结果是(A,3)(B,4)(C,1)(B,2)。当然&#xff0c;如果相邻字符重复情况较少&#xff0c;则压缩效率就较低。
现要求根据输入的字符串&#xff0c;得到大小写不敏感压缩后的结果&#xff08;即所有小写字母均视为相应的大写字母&#xff09;。
输入
一个字符串&#xff0c;长度大于0&#xff0c;且不超过1000&#xff0c;全部由大写或小写字母组成。
输出
输出为一行&#xff0c;表示压缩结果&#xff0c;形式为&#xff1a;
(A,3)(B,4)(C,1)(B,2)
即每对括号内部分别为字符&#xff08;都为大写&#xff09;及重复出现的次数&#xff0c;不含任何空格。
样例输入
aAABBbBCCCaaaaa
样例输出
(A,3)(B,4)(C,3)(A,5)
这个题只需要将T31改改就行
C&#43;&#43;标准函数库string中自带小写转换成大写strupr&#xff0c;大写转换成小写strlwr&#xff0c;但在noi网站上不能编译&#xff0c;搞不懂为什么&#xff0c;代码如下&#xff1a;
1 #include
2 #include
3 #include
4 using namespace std;
5 char a[1001];
6 int s;
7 int main()
8 {
9 cin>>a;
10 strupr(a);
11 int q;
12 for(q&#61;0;q
13 if(a[q]!&#61;a[q&#43;1]) break;
14 else s&#43;&#43;;
15 s&#43;&#43;;//当break时&#xff0c;由于比较的是q和q&#43;1&#xff0c;第q个与第q-1个是相等的所以s&#43;1
16 if(s&#61;&#61;strlen(a))//整个串只有一种的情况
17 {
18 printf("(%c,%d)",a[0],s);
19 return 0;
20 }
21 for(int i&#61;q&#43;1;i
22 {
23 if(a[i]&#61;&#61;a[i-1]) s&#43;&#43;;
24 else
25 {
26 printf("(%c,%d)",a[i-1],s);//因为比较的是i和 i-1&#xff0c;输出i-1的情况&#xff0c;所以最后一种在循环里无法输出
27 s&#61;1;//不相等时&#xff0c;自己本身有长度为1&#xff0c;所以s不是0
28 }
29 }
30 printf("(%c,%d)",a[strlen(a)-1],s);//输出最后一种
31 }
另一种小写转换成大写的方式是toupper函数&#xff0c;需要一个字符一个字符的转换&#xff0c;属于cctype函数系列
cctype函数系列归纳&#xff1a;http://blog.csdn.net/dingwood/article/details/7401146
代码如下&#xff08;只需更改上面代码中的strupr语句&#xff09;&#xff1a;
1 #include
10 for(int i&#61;0;i
12 int q;
13 for(q&#61;0;q
15 else s&#43;&#43;;
16 s&#43;&#43;;//当break时&#xff0c;由于比较的是q和q&#43;1&#xff0c;第q个与第q-1个是相等的所以s&#43;1
17 if(s&#61;&#61;strlen(a))//整个串只有一种的情况
18 {
19 printf("(%c,%d)",a[0],s);
20 return 0;
21 }
22 for(int i&#61;q&#43;1;i
24 if(a[i]&#61;&#61;a[i-1]) s&#43;&#43;;
25 else
26 {
27 printf("(%c,%d)",a[i-1],s);//因为比较的是i和 i-1&#xff0c;输出i-1的情况&#xff0c;所以最后一种在循环里无法输出
28 s&#61;1;//不相等时&#xff0c;自己本身有长度为1&#xff0c;所以s不是0
29 }
30 }
31 printf("(%c,%d)",a[strlen(a)-1],s);//输出最后一种
32 }
当然不怕麻烦又有耐心的同志们也可以自己敲大写转换&#xff0c;我这个懒人就不写了
T33 判断字符串是否为回文
描述
输入一个字符串&#xff0c;输出该字符串是否回文。回文是指顺读和倒读都一样的字符串。
输入
输入为一行字符串&#xff08;字符串中没有空白字符&#xff0c;字符串长度不超过100&#xff09;。
输出
如果字符串是回文&#xff0c;输出yes&#xff1b;否则&#xff0c;输出no。
样例输入
abcdedcba
样例输出
yes
正着倒着一起遍历一遍&#xff0c;不一样就输出no&#xff0c;结束&#xff0c;否则最后输出yes
1 #include
2 #include
3 using namespace std;
4 char a[101];
5 int main()
6 {
7 cin>>a;
8 int i&#61;0,j&#61;strlen(a)-1;
9 while(i<strlen(a))
10 {
11 if(a[i]!&#61;a[j])
12 {
13 cout<<"no";
14 return 0;
15 }
16 else
17 {
18 i&#43;&#43;;j--;
19 }
20 }
21 cout<<"yes";
22 }
T34 回文子串
描述
给定一个字符串&#xff0c;输出所有长度至少为2的回文子串。
回文子串即从左往右输出和从右往左输出结果是一样的字符串&#xff0c;比如&#xff1a;abba&#xff0c;cccdeedccc都是回文字符串。
输入
一个字符串&#xff0c;由字母或数字组成。长度500以内。
输出
输出所有的回文子串&#xff0c;每个子串一行。
子串长度小的优先输出&#xff0c;若长度相等&#xff0c;则出现位置靠左的优先输出。
样例输入
123321125775165561
样例输出
33
11
77
55
2332
2112
5775
6556
123321
165561
1 #include
2 #include
3 using namespace std;
4 char a[501];
5 int main()
6 {
7 cin>>a;
8 int len&#61;strlen(a);
9 for(int l&#61;2;l<&#61;len;l&#43;&#43;) //枚举子串长度
10 {
11 for(int q&#61;0;q<&#61;len-l;q&#43;&#43;)//枚举长为l的子串左端点
12 {
13 int z&#61;q&#43;l-1;//长为l的子串的右端点
14 int i&#61;q,j&#61;z;
15 bool ok&#61;true;
16 while(i<&#61;z)
17 {
18 if(a[i]!&#61;a[j])
19 {
20 ok&#61;false;break;
21 }
22 i&#43;&#43;;j--;
23 }
24 if(ok)
25 {
26 for(int k&#61;q;k<&#61;z;k&#43;&#43;) cout<<a[k];
27 cout<<endl;
28 }
29 }
30 }
31 }
T35 字符串的展开
描述
在初赛普及组的“阅读程序写结果”的问题中&#xff0c;我们曾给出一个字符串展开的例子&#xff1a;如果在输入的字符串中&#xff0c;含有类似于“d-h”或者“4-8”的字串&#xff0c;我们就把它当作一种简写&#xff0c;输出时&#xff0c;用连续递增的字母获数字串替代其中的减号&#xff0c;即&#xff0c;将上面两个子串分别输出为“defgh”和“45678”。在本题中&#xff0c;我们通过增加一些参数的设置&#xff0c;使字符串的展开更为灵活。具体约定如下&#xff1a;
(1) 遇到下面的情况需要做字符串的展开&#xff1a;在输入的字符串中&#xff0c;出现了减号“-”&#xff0c;减号两侧同为小写字母或同为数字&#xff0c;且按照ASCII码的顺序&#xff0c;减号右边的字符严格大于左边的字符。
(2) 参数p1&#xff1a;展开方式。p1&#61;1时&#xff0c;对于字母子串&#xff0c;填充小写字母&#xff1b;p1&#61;2时&#xff0c;对于字母子串&#xff0c;填充大写字母。这两种情况下数字子串的填充方式相同。p1&#61;3时&#xff0c;不论是字母子串还是数字字串&#xff0c;都用与要填充的字母个数相同的星号“*”来填充。
(3) 参数p2&#xff1a;填充字符的重复个数。p2&#61;k表示同一个字符要连续填充k个。例如&#xff0c;当p2&#61;3时&#xff0c;子串“d-h”应扩展为“deeefffgggh”。减号两边的字符不变。
(4) 参数p3&#xff1a;是否改为逆序&#xff1a;p3&#61;1表示维持原来顺序&#xff0c;p3&#61;2表示采用逆序输出&#xff0c;注意这时候仍然不包括减号两端的字符。例如当p1&#61;1、p2&#61;2、p3&#61;2时&#xff0c;子串“d-h”应扩展为“dggffeeh”。
(5) 如果减号右边的字符恰好是左边字符的后继&#xff0c;只删除中间的减号&#xff0c;例如&#xff1a;“d-e”应输出为“de”&#xff0c;“3-4”应输出为“34”。如果减号右边的字符按照ASCII码的顺序小于或等于左边字符&#xff0c;输出时&#xff0c;要保留中间的减号&#xff0c;例如&#xff1a;“d-d”应输出为“d-d”&#xff0c;“3-1”应输出为“3-1”。
输入
包括两行&#xff1a;
第1行为用空格隔开的3个正整数&#xff0c;一次表示参数p1&#xff0c;p2&#xff0c;p3。
第2行为一行字符串&#xff0c;仅由数字、小写字母和减号“-”组成。行首和行末均无空格。
40%的数据满足&#xff1a;字符串长度不超过5&#xff1b;
100%的数据满足&#xff1a;1<&#61;p1<&#61;3&#xff0c;1<&#61;p2<&#61;8&#xff0c;1<&#61;p3<&#61;2。字符串长度不超过100。
输出
只有一行&#xff0c;为展开后的字符串。
样例输入
样例 #1&#xff1a;
1 2 1
abcs-w1234-9s-4zz样例 #2&#xff1a;
2 3 2
a-d-d样例 #3&#xff1a;
3 4 2
di-jkstra2-6
样例输出
样例 #1&#xff1a;
abcsttuuvvw1234556677889s-4zz样例 #2&#xff1a;
aCCCBBBd-d样例 #3&#xff1a;
dijkstra2************6
模拟&#xff0c;依次枚举每个‘-’&#xff0c;参数p1和p2可以放在一起判断。
开头或结尾的-直接else输出 &#xff1b;
几个-连在一起&#xff0c;直接输出- &#xff1b;
-两边是字符和数字或者没有按升序排列&#xff0c;输出-&#xff1b;因为字母的acsll码本来就大于数字的&#xff0c;所以只需要另判断左边是数字右边是字母即可
对于p1&#xff0c;大写转换成小写可以用tolower&#xff08;&#xff09;&#xff0c;将括号内的字母大写转换成小写&#xff0c;对于原本是小写的字母返回本身&#xff0c;小写转换成大写用toupper
p3的逆序可以直接用reverse函数&#xff0c;头文件algorithm&#xff0c;格式reverse&#xff08;要翻转数组的第一个元素的位置&#xff0c;最后一个元素的后一个位置&#xff09;
C&#43;&#43;在for循环时自动完成整形与字符型的转换&#xff0c;所以对于字母也可以和数字一样进行循环
一定要特别注意本题可能出现开头是‘-’&#xff0c;末尾是‘-’&#xff0c;好多个‘-’连起来的情况
1 #include
2 #include
3 #include
4 using namespace std;
5 int p1,p2,p3,len,sum;
6 char a[30000],b[30000];
7 int main()
8 {
9 cin>>p1>>p2>>p3>>a;
10 len&#61;strlen(a);
11 for(int i&#61;0;i
12 if(a[i]&#61;&#61;&#39;-&#39;&&i&&i<&#61;strlen(a)-2)//开头或结尾的-直接else输出
13 {
14 if(a[i-1]&#61;&#61;&#39;-&#39;||a[i&#43;1]&#61;&#61;&#39;-&#39;) cout<<&#39;-&#39;;//几个-连在一起&#xff0c;直接输出-
15 else if(a[i&#43;1]&#61;&#61;a[i-1]&#43;1) continue;//-两边ascll码是连续的&#xff0c;跳过-
16 else if(a[i-1]>&#61;a[i&#43;1]||(a[i-1]<&#61;&#39;9&#39;&&a[i&#43;1]>&#61;&#39;A&#39;)) cout<<&#39;-&#39;;//-两边是字符和数字或者没有按升序排列&#xff0c;输出-&#xff1b;因为字母的acsll码本来就大于数字的&#xff0c;所以只需要另判断左边是数字右边是字母即可
17 else
18 {
19 int l&#61;0;
20 if(p1&#61;&#61;1)
21 {
22 for(int j&#61;a[i-1]&#43;1;j1];j&#43;&#43;)//枚举过程中字符型自动转化为整形
23 {
24 for(int k&#61;1;k<&#61;p2;k&#43;&#43;)
25 b[l&#43;&#43;]&#61;tolower((char)j);//整形强制转换成字符型
26 }
27 }
28 else if(p1&#61;&#61;2)
29 {
30 for(int j&#61;a[i-1]&#43;1;j1];j&#43;&#43;)
31 {
32 for(int k&#61;1;k<&#61;p2;k&#43;&#43;)
33 b[l&#43;&#43;]&#61;toupper((char)j);
34 }
35 }
36 else
37 {
38 for(int j&#61;a[i-1]&#43;1;j1];j&#43;&#43;)
39 {
40 for(int k&#61;1;k<&#61;p2;k&#43;&#43;)
41 b[l&#43;&#43;]&#61;&#39;*&#39;;
42 }
43 }
44 if(p3&#61;&#61;2)
45 reverse(b,b&#43;l);//数组翻转
46 for(int j&#61;0;j
47 cout<<b[j];
48 }
49 }
50 else cout<<a[i];
51 }
第一遍交WA&#xff0c;原因&#xff1a;没有判断减号两边是字母和数字的情况&#xff0c;左字母右数字&#xff0c;字母的ascll码大于数字&#xff0c;所以输出-正确&#xff1b;左数字右字母&#xff0c;就按升序做了&#xff0c;错误
第二遍交RE&#xff0c;原因&#xff1a;忽略了开头或结尾可能是-&#xff0c;因为数组从0开始&#xff0c;数组大小有恰好卡到题目给出的范围&#xff0c;比较减号两边的数要-1或&#43;1&#xff0c;数组越界了
第三遍交WA&#xff0c;原因&#xff1a;没有考虑好几个-相连的情况。几个减号相连&#xff0c;对中间的-没有影响&#xff0c;因为左右都是-&#xff0c;可以通过-两边的ascll码相等排除&#xff1b;对于最右边的-&#xff0c;左边是-&#xff0c;右边是数字或字母&#xff0c;由于-的ascll码是155&#xff0c;大于数字和字母的&#xff0c;可以通过减号右边的字符按照ASCII码的顺序小于左边字符排除;但对于最左边的-&#xff0c;左边是数字或字母&#xff0c;右边是-&#xff0c;就按升序做了&#xff0c;错误
第四遍交RE&#xff0c;原因&#xff1a;数组开小了&#xff0c;开始时待反转数组b开到了101&#xff0c;根据题目&#xff0c;极限扩展情况为a-z或A-Z&#xff0c;要扩展出24*8&#61;192个
noip题毕竟是noip题啊&#xff0c;看着简单不好得分&#xff0c;很多种情况需要仔细考虑