poj kmp入门几题 mark
来源:互联网 发布:淘宝 买摩托车 编辑:程序博客网 时间:2024/05/20 13:40
poj 3461:找模式串在匹配串中出现的次数
#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <algorithm>#include <string>#include <vector>#include <stack>#include <bitset>#include <set>#include <list>#include <deque>#include <time.h>#include <map>#include <queue>#define pi acos(-1)#define ll long longusing namespace std;const int N=1000020;///字符串下标从0开始 nxt数组下标从1开始 int nxt[N];char S[N],T[N];///T为模式串 int slen,tlen;void getnxt(){int j=0,k=-1;nxt[0]=-1;while(j<tlen){if(k==-1 || T[j]==T[k]) nxt[++j]=++k;else k=nxt[k];} } int kmpidx(){///模式串T在主串S中首次出现的位置 0 idxint i=0,j=0;while(i<slen && j<tlen){if(j==-1 || S[i]==T[j]) ++i,++j;else j=nxt[j];}if(j==tlen) return i-tlen;else return -1;}int kmpcount(){///模式串T在主串S中出现的次数int ans=0,j=0;for(int i=0;i<slen;++i){while(j>0 && S[i]!=T[j]) j=nxt[j];if(S[i]==T[j]) ++j;if(j==tlen) ans++,j=nxt[j];}return ans;}int main(){int t;scanf("%d",&t);while(t--){scanf("%s %s",T,S);tlen=strlen(T),slen=strlen(S);getnxt();//for(int i=1;i<tlen;++i) printf("%d ",nxt[i]); //puts("");//printf("模式串T在主串S中首次出现的位置是: %d\n",kmpidx());//printf("模式串T在主串S中出现的次数是: %d\n",kmpcount());printf("%d\n",kmpcount());}return 0;}
poj 2752 给一个串,找出所有既是前缀又是后缀的子串,升序输出子串长度
考察 对nxt数组的理解 打印nxt数组可以发现
#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <algorithm>#include <string>#include <vector>#include <stack>#include <bitset>#include <set>#include <list>#include <deque>#include <time.h>#include <map>#include <queue>#define pi acos(-1)#define ll long longusing namespace std;const int N=1000020;///字符串下标从0开始 nxt数组下标从1开始 int nxt[N];char S[N],T[N];///T为模式串 int slen,tlen;void getnxt(){int j=0,k=-1;nxt[0]=-1;while(j<tlen){if(k==-1 || T[j]==T[k]) nxt[++j]=++k;else k=nxt[k];}}int main(){///while(scanf("%s",T)==1){tlen=strlen(T),slen=strlen(S);getnxt();//for(int i=1;i<=tlen;++i) printf("%d %d\n",i,nxt[i]);vector<int> vs;vs.push_back(tlen);int tmp=tlen;while(nxt[tmp]!=0){vs.push_back(nxt[tmp]);tmp=nxt[tmp];}reverse(vs.begin(),vs.end());vector<int>::iterator it=vs.begin();printf("%d",*it);for(++it;it!=vs.end();++it) printf(" %d",*it);puts("");}return 0;}
poj 2406
给一个串,要你找出最大的n,使得这个串是由n个相同的子串拼接而成的
#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <algorithm>#include <string>#include <vector>#include <stack>#include <bitset>#include <set>#include <list>#include <deque>#include <time.h>#include <map>#include <queue>#define pi acos(-1)#define ll long longusing namespace std;const int N=1000020;///字符串下标从0开始 nxt数组下标从1开始 int nxt[N];char S[N],T[N];///T为模式串 int slen,tlen;void getnxt(){int j=0,k=-1;nxt[0]=-1;while(j<tlen){if(k==-1 || T[j]==T[k]) nxt[++j]=++k;else k=nxt[k];}}int main(){///while(scanf("%s",T)==1 && T[0]!='.'){tlen=strlen(T);getnxt();//for(int i=1;i<=tlen;++i) printf("%d %d\n",i,nxt[i]);int ans=(tlen%(tlen-nxt[tlen])==0)?tlen/(tlen-nxt[tlen]):1;printf("%d\n",ans);}return 0;}
一个wa点及其nxt数组
aabaabaabaabaab
0 1 0 1 2 3 4 5 6 7 8 9 10 11 12
阅读全文
1 0
- poj kmp入门几题 mark
- POJ KMP 入门4题
- POJ 3461 Oulipo (kmp入门)
- poj 2406Power Strings(KMP入门)
- poj 3461 Oulipo(简单的kmp入门)
- KMP经典入门题
- hdu1686--kmp入门题
- hdu1711--kmp入门题
- hdu2594--kmp入门题
- mark几篇读物
- KMP入门题 Hdu 1711 2594 3746 HUST 1010 Poj 3461 2752 2406 1961 FZU 1901
- poj 3167 KMP好题
- POJ Oulipo(KMP模板题)
- POJ-3461(KMP模版题)
- kmp 入门题(hdu 1711)
- hdu1711(KMP入门题)
- 【Mark】Golang入门
- POJ---KMP
- zzuli-2175: GJJ的日常之再游戏
- MySQL修改表的默认字符集和修改表字段的默认字符集
- malloc(),free()与realloc()
- 小项目练手-Day1
- Deep Learning(深度学习)之(一)特征以及训练方法
- poj kmp入门几题 mark
- HTTPS协议运行机制说明
- Mongoose 4.11 开始的问题 useMongoClient
- Spring+SpringMVC+Spring Data JPA完美整合
- 二十三种设计模式之备忘录模式
- 【转载】--同余定理
- zw版·全程图解Halcon控件安装(delphi2007版)
- 线性时间排序(计数排序、基数排序、桶排序)
- 项目管理idea+maven+git