F
2015-11-20 17:27
267 查看
F
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
给出两串数字A[ ],B[ ],如果B是A的子串,那么输出B在A中第一次出现的位置,否则输出-1。输入
第一行,输入一个T,表明后面有几组数据。每组数据的第一行,输入两个数N、M (1 <= N <= 1000000, 1 <= M <= 10000),N表示第一行数字的个数,M表示第二行数字的个数。接下来两行,分别输入A数列和B数列。输出
输出只有一行。如果数列B在数列A中出现过,输出数列B在数列A中第一次出现的位置,如果没有出现过,输出-1。示例输入
2 13 5 1 2 1 2 3 1 2 3 1 3 2 1 2 1 2 3 1 3 13 5 1 2 1 2 3 1 2 3 1 3 2 1 2 1 2 3 2 1
示例输出
6 10 -1
提示
来源
zmx示例程序
#include<stdio.h> #include<string.h> #include<stdlib.h> int a[1000001],b[1000001]; int next[1000000]; void Next(int str[],int len) { next[0] = -1; for(int j = 1 ; j < len ; j++) { int i = next[j-1]; while(str[j] != str[i+1] && i >= 0) { i = next[i]; } if(str[j] == str[i+1]) { next[j] = i+1; } else { next[j] = -1; } } } int kmp(int des[],int len1,int pat[],int len2) { Next(pat,len2); int p=0,s=0; while(p < len2 && s < len1) { if(pat[p] == des[s]) { p++;s++; } else { if(p==0) { s++; } else { p = next[p-1]+1; } } } if(p < len2) { return -1; } return s-len2+1; } int main() { int i,j,n,m,k,t,l1,l2; scanf("%d",&n); while(n--) { scanf("%d %d",&m,&t); { for(i=0;i<m;i++) scanf("%d",&a[i]); for(i=0;i<t;i++) scanf("%d",&b[i]); k=kmp(a,m,b,t); if(k!=-1) printf("%d %d\n",k,k+t-1); else printf("%d\n",k); } } }
相关文章推荐
- linux设备驱动归纳总结(二):模块的相关基础概念
- read 系统调用剖析
- 解决javax.persistence.TransactionRequiredException: Executing an update/delete query错误
- 自动删除源文件中的指定行--sed
- 保护程序猿滴眼睛---修改VS 2012 编辑器颜色
- 整洁代码
- 深入探讨this指针
- 存储过程
- AsyncTask使用
- 实现Comparator方式排序
- Spring+Mybatis多数据源配置(四)——AbstractRoutingDataSource实现数据源动态切换
- Spring+Mybatis多数据源配置(四)——AbstractRoutingDataSource实现数据源动态切换
- 广义表
- dos命令执行mysql的sql文件
- 利用strlwr()任意大写字母转小写
- Docker + Jenkins + Cordova建设移动端打包平台
- maven "Generating project in Batch mode"问题的解决
- angular源码分析:angular中脏活累活的承担者之$interpolate
- SSH HTTPS 公钥、秘钥、对称加密、非对称加密、 总结理解(有助于网络层理解)
- UVA 10200 Prime Time (打表)