• 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
    ",ans);
     79     }
     80     return 0;
     81 }
  • 相关阅读:
    2.1 maven配置多镜像地址
    6.4 SpringData JPA的使用
    4.3 thymeleaf模板引擎的使用
    java面试题整理
    eclipse配置运行时变量
    postman上传文件
    Python定义字符串、循环
    Charles抓包
    jmeter压测
    JMeter,postman
  • 原文地址:https://www.cnblogs.com/Tree-dream/p/5598946.html
Copyright © 2020-2023  润新知