zoukankan      html  css  js  c++  java
  • hdu 4300 Clairewd’s message KMP应用

    Clairewd’s message

    题意:先一个转换表S,表示第i个拉丁字母转换为s[i],即a -> s[1];(a为明文,s[i]为密文)。之后给你一串长度为n<= 100000的前面为密文后面为明文的串;让你通过密码转换表S在这个串的后面添加字符,使得前面的密文翻译成明文之后与后面相对应,最后输出添加字符后的串(前面密文照常输出);

    Sample Input
    2
    abcdefghijklmnopqrstuvwxyz
    abcdab
    qwertyuiopasdfghjklzxcvbnm
    qwertabcde
     
    Sample Output
    abcdabcd
    qwertabcde
     
    思路:既然前面的密文部分是确定的,并且后面明文的长度不超出整个输入串长度的1/2;这样只需将前面的密文转化为明文,kmp之后,直接按照最后一个字符进行匹配,要求能匹配的长度在前半串之内,这样就找到了输入的明文对应的前缀字符串。同时知道了中间缺少的长度,这样再次使用转换表S即可~~
    坑点:里面最大的长度为2倍的输入串..并且HDU现在貌似MLE归为TLE了..
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    const int N = 2e5 + 7;
    char p[N],T[N],t[30],s[30];
    int f[N];
    void getfail(char *p,int *f)
    {
        f[0] = f[1] = 0;
        int n = strlen(p);
        for(int i = 1;i < n;i++){
            int j = f[i];
            if(j && p[i] != p[j]) j = f[j];
            f[i+1] = (p[i] == p[j] ?j+1:0);// i+1会递推到第n位
        }
    }
    int main()
    {
        int kase;
        scanf("%d",&kase);
        while(kase--){
            scanf("%s%s",s,p);
            int n = strlen(s),m = strlen(p)/2,len = strlen(p);
            for(int i = 0;i < n;i++) t[s[i]-'a'] = 'a'+i; // 密文->明文;
            for(int i = 0;i < m;i++) T[i] = t[p[i]-'a']; // 前半部分密文转为明文;
            for(int i = m;i < len;i++) T[i] = p[i];
            getfail(T,f);
            int id = 0;
            for(int j = f[len];j;j = f[j]){
                if(j <= m){
                    id = j;
                    break;
                }
            }
            int dif = len-id-id;// 减去能匹配的就是中间没有转化的密文的长度
            for(int i = 0;i < dif;i++){
                p[len+i] = t[p[id+i]-'a'];
            }
            p[len+dif] = '';
            printf("%s
    ",p);
        }
    }
  • 相关阅读:
    System.arraycopy()的用法?
    Java当中“+=”和“=+”的区别
    jsp FN 标签库的使用方法
    手作编辑画面处理
    mpfu 位编辑处理?
    5/14 自动跟新 位数编集 百分号添加 手作部品。
    jsp 4-14 知识总结
    jstl split 分割字符串?
    aws vpc 知识总结(助理级)
    典型的软件自动化测试框架
  • 原文地址:https://www.cnblogs.com/hxer/p/5269801.html
Copyright © 2011-2022 走看看