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的主要内容,如果未能解决你的问题,请参考以下文章

「POJ3539」Elevator - 同余类最短路

总结

POJ2778DNA Sequence(AC自动机)

POJ3691DNA repair(AC自动机,DP)

UVA-1572

18.06.03 POJ 4126:DNA 15年程设期末05(状压DP)