题目描述
小Z一直苦于自己使用的IDE不够智能,没法帮他写代码(划掉)帮他纠正代码中的错误。于是他打算自行实现一个智能的IDE,现在请你完成其中一个功能:给你指定的起始字符串begin和终止字符串end,请你在文本串text中将每一对begin和end之间(不含自身)的字符全部替换为目标串aim,begin和end的配对原则为:最左侧的begin与其右侧最近的end优先生效,之后寻找其右侧下一个begin继续应用此规则。每个begin或end只能就近生效一次。
输入格式:
输入共两行,第一行为文本串text(len<10^6 )。
第二行为三个字符串,使用空格分隔,分别为begin、end及aim,均有len<100。输出格式:
一行一个字符串,text按规则替换后的结果。
输入样例:
aaabvvbbesesbbaabbz
aa bb 123输出样例:
aa123bbesesbbaa123bbz
样例解释:
第一对aa和bb将中间的abvv替换为123,第二对aa和bb将空字符串替换为123。
源代码
#include <stdio.h> //begin是一个特殊的东西
#include <string.h>
int main()
{
char text[1100010],place[3000010];
char begin[110],end[110],aim[110];
char ch;
int t=0;
int value;
ch=getchar();
while(ch!='\n')
{
text[t]=ch;
t++;
ch=getchar();
}
int current=0;
scanf("%s %s %s",begin,end,aim);
int len=strlen(text);
int lenbegin=strlen(begin);
int lenend=strlen(end);
int lenaim=strlen(aim);
int arr[len],i,num=0,j;
int pair1=0,pair=0;
for(i=0;i<len;i++)
arr[i]=0;
for(i=0;i<len;i++)
{
if(text[i]==begin[0]&&pair1!=1)
{
int m=1;
current=1;
for(j=i+1;j<i+lenbegin;j++)
{
if(text[j]==begin[m++])
current++;
}
if(current==lenbegin)
{
for(j=i;j<i+lenbegin;j++)
{
arr[j]=1;
}
if(i+lenbegin<len)
i=i+lenbegin-1; //不要忘记-1 因为下次循环开始后 i++
pair1=1;
}
current=0;
}
else if(text[i]==end[0])
{
int m=1;
current=1;
for(j=i+1;j<i+lenend;j++)
{
if(text[j]==end[m++])
current++;
}
if(current==lenend&&pair1==1)
{
value=i;
for(j=i;j<i+lenend;j++)
{
arr[j]=2;
}
if(i+lenend<len)
i=i+lenend-1; //不要忘记-1 因为下次循环开始后 i++
pair1=0;
pair++;
}
current=0;
}
}
int startnum[pair],endnum[pair];
j=0;
int q=0;
if(pair1==1)
{
for(i=value+lenend;i<len;i++)
{
arr[i]=0;
}
}
for(i=0;i<len;i++)
{
if(arr[i]==1)
{
startnum[j++]=i;
i=i+lenbegin-1;
}
else if(arr[i]==2)
{
endnum[q++]=i;
i=i+lenend-1;
}
}
j=0;q=0;
int k=0;
for(i=0;i<len;i++)
{
if(i!=startnum[j])
{
place[k++]=text[i];
}
else if(i==startnum[j])
{
while(q<lenbegin)
{
place[k++]=begin[q];
q++;
}
q=0;
while(q<lenaim)
{
place[k++]=aim[q];
q++;
}
q=0;
while(q<lenend)
{
place[k++]=end[q];
q++;
}
q=0;
i=endnum[j]+lenend-1;
j++;
}
}
for(i=0;i<k;i++)
printf("%c",place[i]);
return 0;
}