poj 1572
Posted 一个_小菜鸟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj 1572相关的知识,希望对你有一定的参考价值。
一道字符串替换的题目。
题意:给你2*n组字符串,一个是规则,一个是替换的结果。
字符串的题目,确实麻烦,有些细节不处理好就是wa。
这里我提供1组数据
intput
1
abcdef
a
abcdef
1
ab
ababab
output
a
<empty line>
1 #include <stdio.h> 2 #include <string.h> 3 #include <iostream> 4 5 using namespace std; 6 7 int next[100][300]; 8 char rule[100][100],rep[100][300],ans[300],tmp[300]; 9 10 void makenext(int i) //kmp求next数组。 11 { 12 int q,k; 13 int m = strlen(rule[i]); 14 next[i][0] = 0; 15 for (q = 1,k = 0; q < m; ++q) 16 { 17 while(k > 0 && rule[i][q] != rule[i][k]) 18 k = next[i][k-1]; 19 if (rule[i][q] == rule[i][k]) 20 { 21 k++; 22 } 23 next[i][q] = k; 24 } 25 } 26 27 void clea() 28 { 29 memset(rule,0,sizeof(rule[0])); 30 memset(rep,0,sizeof(rep[0])); 31 memset(next,0,sizeof(next[0])); 32 memset(tmp,0,sizeof(tmp)); 33 memset(ans,0,sizeof(ans)); 34 } 35 36 int main() 37 { 38 int n; 39 while(scanf("%d",&n),n!=0) 40 { 41 clea(); 42 getchar(); 43 for(int i=0;i<n;i++) 44 { 45 gets(rule[i]); 46 gets(rep[i]); 47 makenext(i); 48 } 49 gets(ans); 50 for(int i=0;i<n;i++) 51 { 52 int len=strlen(ans),len2=strlen(rep[i]),len3=strlen(rule[i]),j=0,q=0; 53 for(j=0;j<len;j++) 54 { 55 while(q>0&&ans[j]!=rule[i][q]) 56 q=next[i][q-1]; 57 if(ans[j]==rule[i][q]) 58 q++; 59 if(len3==q) 60 { 61 memset(tmp,0,sizeof(tmp)); 62 for(int m=0;m<=len-len3+len2;m++) //替换。这里处理相对麻烦,尤其是等号的问题。 63 { 64 if(m<=j-q) tmp[m]=ans[m]; 65 else if(m<=j-q+len2){ 66 for(int p=0;p<len2;p++,m++) 67 tmp[m]=rep[i][p]; 68 m--;} 69 else tmp[m]=ans[++j]; 70 } 71 strcpy(ans,tmp); 72 j=-1; 73 q=0; 74 len=strlen(ans); 75 } 76 } 77 } 78 printf("%s\n",ans); 79 } 80 return 0; 81 }
以上是关于poj 1572的主要内容,如果未能解决你的问题,请参考以下文章