链接:https://ac.nowcoder.com/acm/contest/372/C
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
另一天,一只可爱的围着围巾的肥企鹅在路上摇摇晃晃地走着,遇上了迎面走来的打着饱嗝的PM6。小企鹅预感不妙,这不就是最近有名的恶人PM6么!吓得立刻扭头就想跑。
PM6:“小火汁,站住!我不吃你(谁叫你是保护动物)。我这有一道简单题,如果你答对了,我就给你吃鱼肉,如果你答错了,就免费帮我充游戏币!”
企鹅:“_(:3J∠)_(默默摘掉围巾)”
PM6:“我给你一个文本串 S ,再给你两个串A、B,你要将文本串中的 A 都转换成 B ,转换后的字符不再参与转换,输出最终的文本串。”
求求你救救企鹅!
输入描述:
第一行输入一个文本串 S 。 第二行输入字符串 A 。 第三行输入字符串 B 。 |S|为S的长度,|A|为A的长度,|B|为B的长度,所有字符都是小写字母,保证 |A| <= |S| 。 对于50%的数据:1<= |A|、|B|、|S| <=1000 对于100%的数据:1<= |A|、|B|、|S| <=1000000
输出描述:
只有一行,输出转换后的文本串。
示例1
输入
abababcd ab cd
输出
cdcdcdcd
分析:一开始我没有读懂这道题的意思,后来明白了,意思是字符串s从第一个字符开始,与a字符串进行匹配,如果能完全匹配,就输出b字符串,否则输出s字符串对应位置的字符串,直到把整个s字符串遍历完毕。
#include<stdio.h>
const int M=1e6+5;
char s[M],a[M],b[M];
int i,j,k,n,t,ls,la,lb;
int main()
{
scanf("%s",s);
scanf("%s",a);
scanf("%s",b);
while(s[ls]) ls++;//统计s字符串长度
while(a[la]) la++;//统计a字符串长度(a与b是相同的)
n=0;
while(1)
{
t=1;
for(i=0;i<la;i++)//s字符串开始遍历,查找是否有与a字符串完全相等的区间段
{
if(s[n+i]-a[i])//只要有一个字符不相等就直接结束,进行标记
{
t=0;break;
}
}
if(t)//如果有相同的区间段
{
printf("%s",b);//输出a字符串对应的b字符串
n+=i;
}
else//否则仅输出对应位置的字符,从下一个字符串继续开始查找
{
printf("%c",s[n]);
n++;
}
if(n==ls)//如果已经遍历到了最后一个字符,结束
break;
}
}