hdu 1711 Number Sequence KMP模板题
2015-06-01 23:25
267 查看
#include<vector> #include<cmath> #include<cstring> #include<algorithm> #include<string> #include<cstdio> #include<iostream> using namespace std; typedef long long LL; const int maxn = 1000005; const int maxm = 10005; int n,m,text[maxn],pat[maxm]; int kmp() { int next[maxm]={0}; for(int i=1;i<m;++i){ int j=i; while(j>0){ j=next[j]; if(pat[j]==pat[i]){ next[i+1]=j+1;break; } } } for(int i=0,j=0;i<n;++i){ if(j<m&&text[i]==pat[j]) j++; else { while(j>0){ j=next[j]; if(text[i]==pat[j]){j++;break; } } } if(j==m) return i-m+2; } return -1; } void solve() { scanf("%d%d",&n,&m); for(int i=0;i<n;i++) scanf("%d",&text[i]); for(int i=0;i<m;i++) scanf("%d",&pat[i]); printf("%d\n",kmp()); } int main() { int T; scanf("%d",&T); while(T--) { solve(); } return 0; }
</pre>题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711<p></p><p></p><p></p><div class="panel_title" align="left" style="height: 38px; background-image: url(http://acm.hdu.edu.cn/images/panel-title.png); background-color: transparent; padding: 0px 14px; color: rgb(124, 169, 237); font-size: 18px; font-family: Arial; font-weight: bold; background-position: 0% 100%; background-repeat: no-repeat no-repeat;">Problem Description</div><div class="panel_content" style="height: auto; background-image: url(http://acm.hdu.edu.cn/images/panel-content.png); margin: 0px; padding: 0px 20px; font-size: 14px; font-family: 'Times New Roman'; background-repeat: no-repeat repeat;">Given two sequences of numbers : a[1], a[2], ...... , a , and b[1], b[2], ...... , b[M] (1 <= M <= 10000, 1 <= N <= 1000000). Your task is to find a number K which make a[K] = b[1], a[K + 1] = b[2], ...... , a[K + M - 1] = b[M]. If there are more than one K exist, output the smallest one.</div><div class="panel_bottom" style="height: auto; margin: 0px; background-image: url(http://acm.hdu.edu.cn/images/panel-bottom.png); font-family: 'Times New Roman';font-size:14px; text-align: -webkit-center; background-position: 0% 0%; background-repeat: no-repeat no-repeat;"> </div><br style="font-family: 'Times New Roman';font-size:14px; text-align: -webkit-center;" /><div class="panel_title" align="left" style="height: 38px; background-image: url(http://acm.hdu.edu.cn/images/panel-title.png); background-color: transparent; padding: 0px 14px; color: rgb(124, 169, 237); font-size: 18px; font-family: Arial; font-weight: bold; background-position: 0% 100%; background-repeat: no-repeat no-repeat;">Input</div><div class="panel_content" style="height: auto; background-image: url(http://acm.hdu.edu.cn/images/panel-content.png); margin: 0px; padding: 0px 20px; font-size: 14px; font-family: 'Times New Roman'; background-repeat: no-repeat repeat;">The first line of input is a number T which indicate the number of cases. Each case contains three lines. The first line is two numbers N and M (1 <= M <= 10000, 1 <= N <= 1000000). The second line contains N integers which indicate a[1], a[2], ...... , a . The third line contains M integers which indicate b[1], b[2], ...... , b[M]. All integers are in the range of [-1000000, 1000000].</div><div class="panel_bottom" style="height: auto; margin: 0px; background-image: url(http://acm.hdu.edu.cn/images/panel-bottom.png); font-family: 'Times New Roman';font-size:14px; text-align: -webkit-center; background-position: 0% 0%; background-repeat: no-repeat no-repeat;"> </div><br style="font-family: 'Times New Roman';font-size:14px; text-align: -webkit-center;" /><div class="panel_title" align="left" style="height: 38px; background-image: url(http://acm.hdu.edu.cn/images/panel-title.png); background-color: transparent; padding: 0px 14px; color: rgb(124, 169, 237); font-size: 18px; font-family: Arial; font-weight: bold; background-position: 0% 100%; background-repeat: no-repeat no-repeat;">Output</div><div class="panel_content" style="height: auto; background-image: url(http://acm.hdu.edu.cn/images/panel-content.png); margin: 0px; padding: 0px 20px; font-size: 14px; font-family: 'Times New Roman'; background-repeat: no-repeat repeat;">For each test case, you should output one line which only contain K described above. If no such K exists, output -1 instead.</div><div class="panel_bottom" style="height: auto; margin: 0px; background-image: url(http://acm.hdu.edu.cn/images/panel-bottom.png); font-family: 'Times New Roman';font-size:14px; text-align: -webkit-center; background-position: 0% 0%; background-repeat: no-repeat no-repeat;"> </div><br style="font-family: 'Times New Roman';font-size:14px; text-align: -webkit-center;" /><div class="panel_title" align="left" style="height: 38px; background-image: url(http://acm.hdu.edu.cn/images/panel-title.png); background-color: transparent; padding: 0px 14px; color: rgb(124, 169, 237); font-size: 18px; font-family: Arial; font-weight: bold; background-position: 0% 100%; background-repeat: no-repeat no-repeat;">Sample Input</div><div class="panel_content" style="height: auto; background-image: url(http://acm.hdu.edu.cn/images/panel-content.png); margin: 0px; padding: 0px 20px; font-size: 14px; font-family: 'Times New Roman'; background-repeat: no-repeat repeat;"><pre style="word-wrap: break-word; white-space: pre-wrap; margin-top: 0px; margin-bottom: 0px;"><div style="font-family: 'Courier New', Courier, monospace;">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</div>
Sample Output
6 -1
把数组直接KMP匹配即可,模板题
相关文章推荐
- Maximum Subsequence Sum
- iOS UIview 学习
- SSDB --- queue实现
- IOS初级:UIwindow
- android蓝牙框架bluedroid之sbc编码
- 【Android UI设计与开发】第02期:引导界面(二)使用ViewPager实现欢迎引导页面
- UIView UIWindow
- (转)IOS UITableView学习
- 关于easyui Tree取得选中节点的父级节点(得到选取实心圆点的id)
- UIView 中常见的方法总结
- Java中带标签的break、continue
- UISearchDisplayController搜索(iOS8前)
- 关于UITweener老是卡帧的问题
- How to replace a value in web.xml with a Maven property?(转)
- Android---手动创建线程与GUI线程同步(三)
- 020_01UI组件之Dialog详细用法
- cdoj 04 Complete Building the Houses 暴力
- poj 3061 Subsequence
- Distinct Subsequences
- Android---手动创建线程与GUI线程同步(二)