poj 1572 Automatic Editing 字符串

/*
	很简单一题,但是因为英语不好,没过(老是超时)
*/#include<stdio.h>
#include<string.h>
struct node
{
	char s1[100],s2[100];
}q[11];
char s[300];
void cao(char *p,int i)//原先用string.h中的函数,老超时,就自己操作了,还是超时,就没改回去
{
	int len1=strlen(q[i].s1),len2=strlen(q[i].s2),len=strlen(s);
	int k=len2-len1;
	char *pp=&s[len];
	if(k>0)
	{
		while(pp>=(p+len1))
		{
			*(pp+k)=*pp;
			pp--;
		}
	}
	else if(k<0)
	{
		k=-k;
		pp=p+len1;
		while(1)
		{
			*(pp-k)=*pp;
			if(!*pp)
				break;
			pp++;
		}
	}
	pp=q[i].s2;
	while(*pp)
	{
		*p=*pp;
		p++;
		pp++;
	}
}
void ha(int n)
{
	int i;
	char *p;
	while(1)
	{
		for(i=0;i<n;i++)
		{
			p=strstr(s,q[i].s1);
			if(p)
			{
				cao(p,i);
				i--;//原先以为每次替换后都要从第一组开始匹配,这行原来是break;
				//后来发现上图(他的意思是:轮到哪组时,一直找这组,知道再也发现不了,轮到下一组),改为现状
			}
		}
		if(i!=n)
			continue;
		return;
	}
}
int main()
{
	int n,i;
	while(scanf("%d",&n),n)
	{
		getchar();
		for(i=0;i<n;i++)
		{
			gets(q[i].s1);
			gets(q[i].s2);
		}
		gets(s);
		ha(n);
		puts(s);
	}
	return 0;
}

你可能感兴趣的:(poj 1572 Automatic Editing 字符串)