这题主要是有点恶心...直得留意的是题目中提到的..前缀和后缀只会出现一次...还有就是前缀为re时的处理..应该是最后才加again...所以这使得程序不能边递归判断,边输出..那么先确定当前单词的类型,(前缀是哪个...后缀是哪个)..并且将这个单词去掉前缀后缀给还原..然后再按题目要求输出..关于砍掉前面一部分..我是
strcpy(s,s+k);
关于减去后面一部分..我是
s[l-k]='\0';
Program:
#include<iostream>
#include<string.h>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<queue>
using namespace std;
char s[150];
int t,l,p1,p2;
void test()
{
if (!p1 && s[0]=='a' && s[1]=='n' && s[2]=='t' && s[3]=='i')
{
p1=1;
strcpy(s,s+4);
test();
return;
}//-----anti
if (!p1 && s[0]=='p' && s[1]=='o' && s[2]=='s' && s[3]=='t')
{
p1=2;
strcpy(s,s+4);
test();
return;
}//-----post
if (!p1 && s[0]=='p' && s[1]=='r' && s[2]=='e')
{
p1=3;
strcpy(s,s+3);
test();
return;
}//-----pre
if (!p1 && s[0]=='r' && s[1]=='e')
{
p1=4;
strcpy(s,s+2);
test();
return;
}//-----re
if (!p1 && s[0]=='u' && s[1]=='n')
{
p1=5;
strcpy(s,s+2);
test();
return;
}//-----un
l=strlen(s);
if (!p2 && l>=2 && s[l-1]=='r' && s[l-2]=='e')
{
p2=1;
s[l-2]='\0';
test();
return;
}//-----er
if (!p2 && l>=3 && s[l-1]=='g' && s[l-2]=='n' && s[l-3]=='i')
{
p2=2;
s[l-3]='\0';
test();
return;
}//-----ing
if (!p2 && l>=3 && s[l-1]=='e' && s[l-2]=='z' && s[l-3]=='i')
{
p2=3;
s[l-3]='\0';
test();
return;
}//-----ize
if (!p2 && l>=1 && s[l-1]=='s')
{
p2=4;
s[l-1]='\0';
test();
return;
}//-----s
if (!p2 && l>=4 && s[l-1]=='n' && s[l-2]=='o' && s[l-3]=='i' && s[l-4]=='t')
{
p2=5;
s[l-4]='\0';
test();
return;
}//-----tion
return;
}
int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
scanf("%d",&t);
while (t--)
{
scanf("%s",s);
p1=p2=0;
test();
if (p1==1) printf("against "); else
if (p1==2) printf("after "); else
if (p1==3) printf("before "); else
if (p1==5) printf("not ");
if (p2==1) printf("one who "); else
if (p2==2) printf("to actively "); else
if (p2==3) printf("change into "); else
if (p2==4) printf("multiple instances of "); else
if (p2==5) printf("the process of ");
printf("%s",s);
if (p2==1) printf("s");
if (p2==5) printf("ing");
if (p1==4) printf(" again");
printf("\n");
}
return 0;
}