Problem 2183 简单题
Accept: 48 Submit: 236
Time Limit: 1000 mSec Memory Limit : 32768 KB
Problem Description
传送门:http://acm.fzu.edu.cn/contest/problem.php?cid=141&sortid=1
现在有一些被简单压缩的字符串,例如:a[120]代表120个a。对于字符串acb[3]d[5]e相对于acbbbddddde
现在给你两个字符串cString, nString.一个是被压缩过的字符串,另一个没有被压缩。
求nString是否为cString的子串,如果是输出True,否则输出False.cString的长度clen的范围是0<clen<1000, nString的长度的nlen的范围是0<nlen<1000;cString只包含小写26个字母,[],数字(大于0小于10^9)。nString只包含小写26个字母。
Sample Input
acb[3]d[5]ebd
Sample Output
True
Source
FOJ有奖月赛-2015年03月
一开始一直错,也不知道为什么,后来才发现是少加了while(scanf("%s%s",str1,str2)!=EOF) 感觉被骗了 呵呵
这道题的思路:
就是把数字和字符分开来存放,然后这样就好判断了
#include<stdio.h>
#include<string.h>
char str1[1500],str2[1500];
char string1[1234567],string2[1234567];
//i是数字的起始位置,j是数字的终结位置; 用来求a串的数字;
int change(int i,int j){
int ans=0,l=1;
for(int k=j;k>=i;k--){
ans+=(str1[k]-'0')*l;
l=l*10;
}
return ans;
}
int main(){
int l1,l2;
int i,j,k=0;
while(~scanf("%s%s",str1,str2)){
l1=strlen(str1); l2=strlen(str2);
int num1[1500]={0},num2[1500]={0};
char c;
int num=0;
for(i=0;i<l1;i++){
if(i==0){
c=str1[i];
string1[k]=c;
if(str1[i+1]=='['){
for(j=i+2;;j++) if(str1[j]==']') break;
int ans=change(i+2,j-1);
num1[k]+=ans;
}
else num1[k]++;
}
else {
if(str1[i]==c){
if(str1[i+1]=='['){
for(j=i+2;;j++) if(str1[j]==']') break;
int ans=change(i+2,j-1);
num1[k]+=ans;
}
else num1[k]++;
}
else if(str1[i]!=c&&str1[i]>='a'&&str1[i]<='z'){
k++;
c=str1[i];
string1[k]=c;
if(str1[i+1]=='['){
for(j=i+1;;j++) if(str1[j]==']') break;
int ans=change(i+2,j-1);
num1[k]=ans;
}
else num1[k]++;
}
}
}
string1[k+1]='\0';
/*
printf("%d\n",len1);
for(i=0;i<=k;i++){
printf("%c %d\n",string1[i],num1[i]);
}
*/
int len1=k+1;
//change str2; (也就是b串)
k=0;
for(i=0;i<l2;i++){
char temp=str2[i];
int num=1;
while(str2[i]==str2[i+1]){
num++; i++;
}
num2[k]=num;
string2[k]=temp;
k++;
}
string2[k]='\0';
int len2=k; //代表string2中有几个字符;
//接下来要判断了;
//printf("%d %d\n",len1,len2);
k=0;
int p,q,flag=1;
for(i=0;i<len1;i++){
flag=1;
if(string1[i]==string2[k]){
//len2==1;
if(len2==1){
if(num1[i]>=num2[k]) {flag=1; puts("True"); break;}
else {flag=0; continue;}
}
else if(len2>1){
for(p=k+1,q=i+1;p<=len2-2;p++,q++){
if((string1[q]!=string2[p])||(string1[q]==string2[p] && num1[q]!=num2[p])){
flag=0; break;
}
//printf("%d\n",flag);
}
//printf("%d %d\n",p,q);
if(flag){
if((string1[i]==string2[k]&&num1[i]>=num2[k]) && (string1[q]==string2[p]&&num1[q]>=num2[p])) {flag=1; puts("True"); break;}
else flag=0;
}
}
if(flag) break;
if(!flag) {continue;}
}
}
if(i==len1) puts("False");
}
return 0;
}
一开始我想着要抄别人的代码,后来被学长说要自己做,于是就耐下性子来做,是的,自己做的话也是可以的,只有这样才能不断提高,加油!