zoukankan      html  css  js  c++  java
  • 学密码学一定得学程序 分类: 串 2015-06-18 16:58 22人阅读 评论(0) 收藏

    学密码学一定得学程序

    TimeLimit: 1000ms Memory limit: 65536K 有疑问?点这里^_^

    题目描述


    曾经,ZYJ同学非常喜欢密码学。有一天,他发现了一个很长很长的字符串S1。他很好奇那代表着什么,于是神奇的WL给了他另一个字符串S2。但是很不幸的是,WL忘记跟他说是什么意思了。这个时候,ZYJ不得不求助与伟大的ZPZP笑了笑说,这个很神奇的,WL的意思是只要你找到她给你的字符串在那个神奇的字符串的位置,你就会有神奇的发现。ZYJ恍然大悟,原来如此,但是悲剧来了,他竟然不知道怎么找。。。。是的,很囧是不是。所以这时候就需要化身为超级玛丽亚的你现身了,告诉他吧。。。。。。

    输入


    首先输入一个n。表示有n组测试数据。


    每组测试数据有两行。


    第一行为字符串S1,长度不大于1000000


    第二行为字符串S2,长度不大于10000,并且长度不小于2

    输出


    输出S2S1的位置。如果有多个位置,只输出第一个位置。


    如果找不到,就输出“::>_<::“(不输出双引号)。

    示例输入


    1

    ASDFGDF

    DF

    #include <cstdio>
    #include <cmath>
    #include <cstring>
    #include <cstdlib>
    #include <time.h>
    #include <cctype>
    #include <queue>
    #include <stack>
    #include <map>
    #include <set>
    #include <climits>
    #include <string>
    #include <iostream>
    #include <algorithm>
    #define RR freopen("input.txt","r",stdin)
    #define WW freopen("output.txt","w",stdout)
    #define INF 0x3f3f3f3f
    
    using namespace std;
    
    const int Max=1001000;
    
    int next[Max];
    char s[Max];
    char c[Max];
    void KMP_next()//next数组
    {
        int len=strlen(c);
        int i=0,j=-1;
        next[0]=-1;
        while(i<len-1)
        {
            if(j==-1||c[i]==c[j])
            {
                ++i;
                ++j;
                if(c[i]!=c[j])
                {
                    next[i]=j;
                }
                else
                {
                    next[i]=next[j];
                }
            }
            else
            {
                j=next[j];
            }
        }
    }
    void KMP()//kmp匹配
    {
        int len1=strlen(s);
        int len2=strlen(c);
        int i=0,j=0;
        while(i<len1&&j<len2)
        {
            if(j==-1||s[i]==c[j])
            {
                ++i;
                ++j;
            }
            else
            {
                j=next[j];
            }
        }
        if(j==len2)
        {
            printf("%d
    ",i-len2+1);
        }
        else
        {
            printf("::>_<::
    ");
        }
    }
    int main()
    {
        int n;
        scanf("%d",&n);
        while(n--)
        {
            scanf("%s %s",s,c);
            KMP_next();
            KMP();
        }
    
        return 0;
    }
    


    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    bootstrap表格
    Bootstrap的学习
    cssText文本格式化
    for循环坐标生成《逢五向上转》
    for循环坐标生成《逢十往下一行》
    for
    bootstrap学习笔记细化(表格)
    bootstrap学习笔记细化(按钮)
    bootstrap学习笔记细化(表单)
    bootstrap学习笔记细化(标题)
  • 原文地址:https://www.cnblogs.com/juechen/p/4722021.html
Copyright © 2011-2022 走看看