#http://oj.dlnuxeon.cn/contest/96/problem/C
单词替换
2022/11/29
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
using namespace std;
char arr[100][100];
char arr_check[100][100];
char arr_checkin[10000];
char arrin[10000];
void print(char p[][100]);
void check();
int x1=0,y1=0;
int x2=0,y2=0;
int main(){//偷懒的输入方法
int n;
fflush(stdin);
memset(arr_check,'\0',sizeof(arr_check));
fgets(arr_checkin,10000,stdin);
arr_checkin[strlen(arr_checkin)-1]='\0';//完成这一步后,与gets得到的数组完全一致,不存在末尾的回车
//gets(arr_checkin);//尽量不要用
n=(int)arr_checkin[0]-48;//n ..好像没啥用,这种做法
int sz1=strlen(arr_checkin);
for(int i=2;i<sz1;i++)//把每个单词存到二维数组里面,便于遍历
{
if(arr_checkin[i]==' '){
y1=0;
x1++;
continue;
}
arr_check[x1][y1++]=arr_checkin[i];
}
//以下操作同上
memset(arr,'\0',sizeof(arr));
fflush(stdin);
fgets(arrin,10000,stdin);
arrin[strlen(arrin)-1]='\0';
//gets(arrin);
int sz2=strlen(arrin);
for(int i=0;i<sz2;i++)
{
if(arrin[i]==' '){
y2=0;
x2++;
continue;
}
arr[x2][y2++]=arrin[i];
}
check();
print(arr);
return 0;
}
void print(char p[][100]){//输出函数,二维数组的传递可以这样写
int i=0;
int j=0;
while(p[i][j]!='\0'){
while(p[i][j]!='\0'){
printf("%c",p[i][j++]);
}
i++;j=0;
printf(" ");
}
return;
}
void check()
{
for(int i=0;i<=x2;i++)//从原始字符串中挑选单词
{
int min=999;
for(int k=0;k<=x1;k++)//从词根中挑选单词
{
int sum=0;
int j=0;
while(arr[i][j]==arr_check[k][j]){//如果当前的单词的字母与词根的字母一致,则计数
j++;
sum++;
if(sum==strlen(arr_check[k])&&sum<min)//当词根中的所有字母都对得上,且保证最后的目标单词是最短的
{
min=sum;
strcpy(arr[i],arr_check[k]);//直接用词根覆盖原始单词
break;
}
}
}
}
}