zoukankan      html  css  js  c++  java
  • FZU 2122 又见LKity

    题目链接又见LKity

    ...真是不知道怎么被这个水题卡这么久的,开始用kmp,就是过不了,无脑dbug未果。换了一种kmp模板结果就过了。确实这个模板更好理解一些吧。

    然后暴力0ms过的不知道什么鬼。

    正解kmp一次求出每个字串的位置,代码:

    AC版:

    /*
    已 AC
    */
    
    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    using namespace std;
    
    char s1[210], s2[210], s3[150010];
    int next[210];
    
    void getnext(char p[]) {
        memset(next, 0, sizeof(next));
        int len = strlen(p);
        int i = 0;
        next[0] = -1;
        int k = -1;
        while(i<len) {
            if (k == -1 || p[i] == p[k] || p[i] + 32 == p[k] || p[i] == p[k] + 32) {
                i++;
                k++;
                next[i] = k;
            }
            else k = next[k];
        }
    }
    
    void kmp(char s[], char p[]) {
        int lens = strlen(s);
        int lenp = strlen(p);
        int i = 0, j = 0;
        while(i<lens && j<lenp) {
            if (j == -1 || s[i] == p[j] || s[i] + 32 == p[j] || s[i] == p[j] + 32) {
                i++;
                j++;
            }
            else j = next[j];
            if (j == lenp) { // 说明p[0]到p[len-1]已经匹配成功 s[i-lenp] ... s[i-1] 和 P[0] ... p[lenp-1] 匹配。
                for (int k=i-lenp; k<i; ++k) {
                    s[k] = '~';
                }
                j = next[j];
            }
        }
    }
    
    
    int main() {
        while(~scanf("%[^
    ]", s1)) {
            getchar();
            scanf("%[^
    ]", s2);
            getchar();
            scanf("%[^
    ]", s3);
            getchar();
    
            int len1 = strlen(s1);
            int len2 = strlen(s2);
            int len3 = strlen(s3);
    
            getnext(s1);
            kmp(s3, s1);
    
            //cout << s1 << "===
    " << s2 << "===
    " << s3 << "===
    ";
            for (int i=0; i<len3; ++i) {
                if (s3[i] == '~') {
                    printf("%s", s2);
                    i += len1 - 1;
                }
                else printf("%c", s3[i]);
            }
            printf("
    ");
        }
        return 0;
    }
    

    莫名WA版:

    /*
    WA
    */
    
    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    #include <cmath>
    using namespace std;
    
    char s1[210], s2[210], s3[150010];
    int next[210];
    
    void getnext(char p[]) {
        memset(next, 0, sizeof(next));
        int len = strlen(p+1);
        next[1] = 0;
        for (int k=0, q=2; q<=len; ++q) {
            while(k>0 && abs(p[k+1]-p[q]) != 32 && p[k+1] != p[q])
                k = next[k];
            if (p[k+1] == p[q] || abs(p[k+1]-p[q]) == 32 || k==0)
                k++;
            next[q] = k;
        }
    }
    
    
    bool check(char temp) {
        if (temp >= 'A' && temp <= 'Z')
            return true;
        if (temp >= 'a' && temp <= 'z')
            return true;
        return false;
    }
    
    void kmp(char T[], char P[]) {
        int lenp = strlen(P+1);
        int lent = strlen(T+1);
        getnext(P);
    
        for (int i=1, q=0; i<=lent; ++i) {
            while(q>0 && !(P[q+1] == T[i] || (check(T[i]) && abs(P[q+1]-T[i]) == 32)))
                q = next[q];
            if (P[q+1] == T[i] || (check(T[i]) && abs(P[q+1]-T[i]) == 32))
                q++;
            if (q == lenp) {
                for (int j=i-lenp+1; j<=i; ++j)
                    T[j] = '~';
                q = next[q];
                i = i + lenp - 1;
            }
        }
    }
    
    int main() {
        while(~scanf("%[^
    ]", s1+1)) {
            getchar();
            scanf("%[^
    ]", s2+1);
            getchar();
            scanf("%[^
    ]", s3+1);
            getchar();
    
            kmp(s3, s1);
            int len1 = strlen(s1+1);
            int len2 = strlen(s2+1);
            int len3 = strlen(s3+1);
            for (int i=1; i<=len3; ++i) {
                if (s3[i] == '~') {
                    for (int j=1; j<=len2; ++j) {
                        printf("%c", s2[j]);
                    }
                    i = i + len1 - 1;
                }
                else printf("%c", s3[i]);
            }
            printf("
    ");
        }
        return 0;
    }
    

    暴力版:

    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    using namespace std;
    
    char s1[210], s2[210], s3[210];
    
    int main() {
        while(~scanf("%[^
    ]", s1)) {
            getchar();
            scanf("%[^
    ]", s2);
            getchar();
            scanf("%[^
    ]", s3);
            getchar();
    
            int len1 = strlen(s1);
            int len2 = strlen(s2);
            int len3 = strlen(s3);
    
            for (int i=0; i<len3; ++i) {
                bool ok= true;
                for (int j=0; j<len1; ++j) {
                    if (s3[i+j] != s1[j] && s3[i+j] + 32 != s1[j] && s3[i+j] != s1[j] + 32) {
                        ok = false;
                        break;
                    }
                }
    
                if (ok) {
                    i += len1 - 1;
                    printf("%s", s2);
                }
                else printf("%c", s3[i]);
            }
    
            printf("
    ");
        }
        return 0;
    }
    

    希望不会再浪费这么多时间做无用功!

  • 相关阅读:
    eclipse中文乱码问题解决方案
    修改Tomcat的JDK目录
    Tomcat 5.5 修改服务器的侦听端口
    HTML DOM教程 27HTML DOM Button 对象
    HTML DOM教程 24HTML DOM Frameset 对象
    Navicat for MySQL v8.0.27 的注册码
    HTML DOM教程 25HTML DOM IFrame 对象
    Tomcat 5.5 的下载和安装
    android manifest相关属性
    ubuntu10.04 下 eclipse 小结
  • 原文地址:https://www.cnblogs.com/icode-girl/p/5345585.html
Copyright © 2011-2022 走看看