学密码学一定得学程序

题目描述

曾经,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<string.h>
#define N 1000001
char s1[N],s2[10010];
int main()
{

int n;
scanf("%d",&n);
getchar();
while(n--)
{
gets(s1);
  gets(s2);
char *s3=strstr(s1,s2);
  if(s3==NULL)
  {
    printf("::>_<::\n");
  }
  else
  {
int    k=s3-s1+1;
    printf("%d\n",k);
  }

}

 return 0;
}

方法二:KMP算法

#include<stdio.h>
#include<string.h>
#define N 1000001
char s1[N],s2[10001];
int next[N];
void getnext()
{
  int i=0,j=-1;
  next[0]=-1;
  while(s2[i]!='\0')
  {
    if(j==-1 || s2[i]==s2[j])
    {
      i++;
      j++;
      next[i]=j;
    }
    else
     j=next[j];
  }
}
void KMP()
{
  int i=0,j=0;
  getnext();
  int len1=strlen(s1);
  int len2=strlen(s2);
  while(i<len1 && j<len2)
  {
    if(j==-1 || s1[i]==s2[j])
    {
     i++;
     j++;
    }
    else
    j=next[j];
  }
  if(j>=len2)
  {
    printf("%d\n",i-len2+1);
  }
  else
  {
    printf("::>_<::\n");
  }
}
int main()
{
  int n;
  scanf("%d",&n);
  getchar();
  while(n--)
  {
    gets(s1);
    gets(s2);
    KMP();
  }
  return 0;
}

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

时间: 2024-07-31 03:55:12

学密码学一定得学程序的相关文章

SDUT 2463 学密码学一定得学程序

学密码学一定得学程序 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 曾经,ZYJ同学非常喜欢密码学.有一天,他发现了一个很长很长的字符串S1.他很好奇那代表着什么,于是神奇的WL给了他另一个字符串S2.但是很不幸的是,WL忘记跟他说是什么意思了.这个时候,ZYJ不得不求助与伟大的ZP.ZP笑了笑说,这个很神奇的,WL的意思是只要你找到她给你的字符串在那个神奇的字符串的位置,你就会有神奇的发现.ZYJ恍然大悟,原来如

SDUT OJ 2463 学密码学一定得学程序

#include<iostream> #include<string.h> #include<stdio.h> #define N 10010 #define M 1000100 using namespace std; int next[N]; char s[M],t[N]; void getnext(char s[]) { int i=0,j=-1,len; next[0]=-1; len=strlen(s); while(i<len) { if(j==-1

NPL ( neuro-linguistic programmers 神经语言程序员) / ( Neuro-Linguistic Programming 神经语言程序学/身心语言程式学/ 神经语言程式学/ 神经语言程式)

Neuro-Linguistic Programmers 神经语言程序员 Neuro-Linguistic Programming  神经语言程序学/身心语言程式学/ 神经语言程式学/ 神经语言程式 NLP是神经语言程序学 (Neuro-Linguistic Programming) 的英文缩写.在香港,也有意译为身心语法程式学的.N (Neuro) 指的是神经系统,包括大脑和思维过程.L (Linguistic) 是指语言,更准确点说,是指从感觉信号的输入到构成意思的过程.P (Program

网学--搜索各类论文和源程序

网学--搜索各类论文和源程序:http://www.myeducs.cn/mianfeilunwen/ruanjiankaifalunwen/1573024/index.htm 网学--搜索各类论文和源程序:http://www.myeducs.cn/mianfeilunwen/ruanjiankaifalunwen/1573024/index.htm 网址:http://www.myeducs.cn/mianfeilunwen/ruanjiankaifalunwen/1573024/index

有人说,越低级的程序越难学,越高级的程序越容易学?

学Python是不是很难?是不是越低级的程序越难学,越高级的程序越容易学呢? 仔细分析一下,Python编程一句话:写起来快,看起来明白. 随着编程越来越普及,连小学生的教材里,也有了Python入门的课程,可见人工智能时代学会一门编程语言有多么重要. 所以,表面上来看,越高级的程序越容易学. 但是,如果要学习高级Python编程语言,还是比较难的,这也很正常,如果所有的程序学习起来都那么简单,那人间岂不是到处都是程序员了,Python程序员的薪资水平也不会一路看涨了.那么如果是小白,要学习Py

想学嵌入式开发怎么学?看这份超详细的嵌入式学习路线

嵌入式学习是一个循序渐进的过程,如果是希望向嵌入式软件方向发展的话,目前最常见的是嵌入式Linux方向,关注这个方向,大概分3个阶段: 嵌入式学习的几种线路图 1.嵌入式linux上层应用,包括QT的GUI开发 2.嵌入式linux系统开发 3.嵌入式linux驱动开发 嵌入式目前主要面向的几个操作系统是,LINUX,WINCE.VxWorks等等 Linux是开源免费的,而且其源代码是开放的,更加适合我们学习嵌入式. 你可以尝试以下路线: (1) C语言是所有编程语言中的强者,单片机.DSP.

大牛分享C++学习建议,从入门到精通速学的干货,学到就是赚发了

C++学习建议 大牛分享C++学习建议,从入门到精通速学的干货,学到就是赚发了C++缺点之一,是相对许多语言复杂,而且难学难精.许多人说学习C语言只需一本K&R<C程序设计语言>即可,但C++书籍却是多不胜数.我是从C进入C++,皆是靠阅读自学.在此分享一点学习心得.个人认为,学习C++可分为4个层次:创一个小群,供大家学习交流聊天如果有对学C++方面有什么疑惑问题的,或者有什么想说的想聊的大家可以一起交流学习一起进步呀.也希望大家对学C++能够持之以恒C++爱好群,如果你想要学好C+

所谓“穷人学管理,富人学技术”的荒谬理论

管理计算机如同管理人一样的 人存在的意义是为了做事,但是一个人所能做的事是有限的,所以就有了更多的人一起去做共同的事,但是因为人是不稳定的,若不加以限制,就会出错,所以管理者由此诞生:而管理者,首先本身要会做事,才有资格成为管理者,安排其他人去代替自己做事,成为管理者后,所要做的是与其他人沟通,以这种方式达到让别人代替自己做事的目的:而计算机存在的意义也一样是做事,同时,它能够比人处理更多的事情,只要有更强大的性能,这些性能又可以通过更换硬件来实现,所以可以理解为局限性比人更小:那么我们把计算机

零基础学python-1.5 第一个程序

这一个章节我们来说说怎么建立一个python程序 1.打开idle 2.点击File->new file,然后会弹出一个编辑窗口 3.在编辑窗口里面输入命令代码 程序代码: print("hello world") print("i am ray") print("i love China \n" * 8) print("welcome to my class") print("over") 4.点击