学密码学一定得学程序

    xiaoxiao2025-01-21  10

    题目描述

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

    输入

     

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

    每组测试数据有两行。

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

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

    输出

     

    输出S2在S1的位置。如果有多个位置,只输出第一个位置。

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

    示例输入

    1 ASDFGDF DF

    示例输出

    3

    #include <stdio.h> #include <stdlib.h> #include<string.h> #define max 1000001 #define min 10001 char s1[max],s2[min]; int next[max]; void get_next(char s2[],int next[]) {     int i=0;     next[0]=-1;     int j=-1;     int l2=strlen(s2);     while(i<l2)     {         if(j==-1||s2[i]==s2[j])         {             ++i;++j;             next[i]=j;         }         else             j=next[j];     } } void Index_KMP(char s1[],char s2[],int pos) {     int i=0,j=0;     int l1=strlen(s1),l2=strlen(s2);     while(i<l1&&j<l2)     {         if(j==-1||s1[i]==s2[j])         {             ++i;++j;         }         else             j=next[j];     }     if(j==l2) printf("%d\n",i-l2+1);     else        printf("::>_<::\n"); } void Find(char s1[],char s2[]) {     int i=0,j=0;     while(s1[i+j]!='\0'&&s2[j]!='\0')     {         if(s1[i+j]==s2[j])             j++;         else         {             i++;             j=0;         }     }     if(s2[j]=='\0')         printf("%d\n",i+1);     else         printf("::>_<::\n"); } int main() {     int n,i;     scanf("%d",&n);     for(i=1;i<=n;i++)     {        scanf("%s\n%s",s1,s2);        get_next(s2,next);      //  scanf("%s",s2);        Index_KMP(s1,s2,0);     }     return 0; }

    转载请注明原文地址: https://ju.6miu.com/read-1295695.html
    最新回复(0)