HDU 2203 亲和串(KMP:循环移位)
来源:互联网 发布:apache ab 结果分析 编辑:程序博客网 时间:2024/06/05 21:12
HDU 2203 亲和串(KMP:循环移位)
http://acm.hdu.edu.cn/showproblem.php?pid=2203
题意:
判断两个串T和P是不是亲和串,即P串是不是能和T串循环移动K位后的字符串有匹配点.
分析:
本题的关键在于循环移位,暴力+KMP需要O(n^2)的时间.不过将T串复制一份直接相连,就可以变成TT串,只需要保证strlen(T)>=strlen(P)的情况下,看看P在TT中有没有匹配点即可.(想想是不是这样)
AC代码:
#include <iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>using namespace std;const int MAXN=100000+1000;char T[MAXN*2],P[MAXN];int n,m,next[MAXN];void getFail(){ next[0]=next[1]=0; for(int i=1;i<m;i++) { int j=next[i]; while(j && P[i]!=P[j]) j=next[j]; next[i+1] = (P[i]==P[j])?j+1:0; }}bool KMP(){ if(n<m) return false; int j=0; for(int i=0;i<n*2;i++) { while(j && T[i]!=P[j]) j=next[j]; if(T[i]==P[j]) j++; if(j==m) return true; } return false;}int main(){ while(scanf("%s%s",T,P)==2) { n=strlen(T); m=strlen(P); for(int i=n;i<2*n;i++) T[i]=T[i-n]; T[2*n]=0; if(KMP()) printf("yes\n"); else printf("no\n"); } return 0;}
0 0
- HDU 2203 亲和串(KMP:循环移位)
- (KMP 1.6)hdu 2203 亲和串(判断文本串循环移位之后是否能将模式串包含在其中)
- KMP hdu-2203-亲和串
- HDU 2203 亲和串 KMP
- hdu 2203 亲和串 kmp
- hdu 2203 亲和串(KMP)
- 亲和串 - HDU 2203 KMP
- 【HDU】2203 亲和串 KMP
- HDU 2203(KMP) 亲和串
- HDU 2203 亲和串 (KMP)
- hdu 2203 亲和串 KMP
- HDU - 2203 亲和串(Kmp)
- HDU 2203 亲和串 KMP
- hdu 2203 亲和串(KMP|strstr())
- HDU 2203 亲和串 KMP解法
- HDU 2203 亲和串(kmp)
- 亲和串 (hdu 2203 KMP)
- hdu 2203 亲和串 (kmp入门)
- ZOJ 3772 Calculate the Function
- sdk版本号对照表
- android App应用的打包及发布
- java单例模式
- I2C和SPI,UART的区别(转)
- HDU 2203 亲和串(KMP:循环移位)
- java单例模式5中实现方法
- ZOJ-2109
- 微软强调Win8.1 Update照顾惯用键鼠用户
- C宏定义中## 和# 的含义
- 数据库冗余数据分析
- 面试-线程的生命周期
- HDU 1037 Keep on Truckin'
- 100万并发连接服务器笔记之测试端就绪