POJ 3167 Cow Patterns KMP+暴力
2016-11-01 10:41
344 查看
时空隧道
题意:
给出两个串,如果a和b匹配当且仅当ab中的每个对应位置的数字rank1和rank2相同,rank1代表当前元素前面小于他的元素个数,rank2代表当前元素前面等于他的元素个数,求出匹配串和模式串的匹配位置(开头位置)
分析:
KMP…裸的KMP…就是计算一下rank就好…
因为数字不会超过25,所以直接暴力求rank就好…正解其实是树状数组…
代码如下:
by >_< NeighThorn
题意:
给出两个串,如果a和b匹配当且仅当ab中的每个对应位置的数字rank1和rank2相同,rank1代表当前元素前面小于他的元素个数,rank2代表当前元素前面等于他的元素个数,求出匹配串和模式串的匹配位置(开头位置)
分析:
KMP…裸的KMP…就是计算一下rank就好…
因为数字不会超过25,所以直接暴力求rank就好…正解其实是树状数组…
代码如下:
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> //by NeighThorn using namespace std; const int maxn=100000+5,maxk=25000+5,maxs=25+5; int n,k,s,a[2][maxn],nxt[maxk],num[2][maxn][maxs],vis[maxk]; inline int rank1(int len,int en,int id){ int st=en-len,ans=0; for(int i=1;i<a[id][en];i++) ans+=num[id][en][i]-num[id][st][i]; return ans; } inline int rank2(int len,int en,int id){ return num[id][en][a[id][en]]-num[id][en-len][a[id][en]]; } inline void getnext(void){ nxt[0]=nxt[1]=0;int p; for(int i=1;i<k;i++){ p=nxt[i];int a=rank1(p+1,p+1,1),b=rank1(p+1,i+1,1),c=rank2(p+1,p+1,1),d=rank2(p+1,i+1,1); while(p&&(a!=b||c!=d)) p=nxt[p],a=rank1(p+1,p+1,1),b=rank1(p+1,i+1,1),c=rank2(p+1,p+1,1),d=rank2(p+1,i+1,1); if(rank1(p+1,p+1,1)==rank1(p+1,i+1,1)&&rank2(p+1,p+1,1)==rank2(p+1,i+1,1)) nxt[i+1]=p+1; else nxt[i+1]=0; } } inline void kmp(void){ int posa=1,posb=1,ans=0,stk[maxn]; while(posa<=n){ if(rank1(posb,posa,0)==rank1(posb,posb,1)&&rank2(posb,posa,0)==rank2(posb,posb,1)) posa++,posb++; else if(posb==1) posa++; else posb=nxt[posb-1]+1; if(posb==k+1) stk[++ans]=posa-k,posb=nxt[posb-1]+1; } cout<<ans<<endl; for(int i=1;i<=ans;i++) cout<<stk[i]<<endl; } signed main(void){ scanf("%d%d%d",&n,&k,&s);memset(num,0,sizeof(num)); for(int i=1;i<=n;i++) scanf("%d",&a[0][i]),num[0][i][a[0][i]]=1; memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++) for(int j=1;j<=s;j++) num[0][i][j]+=num[0][i-1][j]; for(int i=1;i<=k;i++) scanf("%d",&a[1][i]),num[1][i][a[1][i]]=1; for(int i=1;i<=k;i++) for(int j=1;j<=s;j++) num[1][i][j]+=num[1][i-1][j]; getnext();kmp(); return 0; }
by >_< NeighThorn
相关文章推荐
- Poj 3167 Cow Patterns Hdu 4749 Parade Show (KMP大小关系相同匹配+树状数组)
- poj 3167 Cow Patterns kmp
- Cow Patterns poj 3167 (hash解法)
- zoj 1905 ||poj 2406 Power Strings(KMP||暴力)
- poj 3080 Blue Jeans 【KMP 暴力枚举】
- POJ 3080 Blue Jeans(暴力枚举+kmp)
- poj 3167 构造比较函数的kmp
- POJ 3167 Cow Patterns (KMP+前缀和)
- POJ 3080--Blue Jeans【KMP && 暴力枚举】
- poj 3623 Best Cow Line, Gold 暴力枚举
- POJ 题目3450 Corporate Identity(KMP 暴力)
- poj 3080 kmp求解多个字符串的最长公共字串,(数据小,有点小暴力 16ms)
- poj 3623 Best Cow Line, Gold 暴力枚举
- poj 3080 Blue Jeans (kmp暴力)
- poj 3080(3450) KMP(暴力也能过) 多个串的最长公共子串
- POJ 3167 Cow Pattern ★(KMP好题)
- poj 2406 Power Strings(数据结构:KMP||暴力)
- 【poj 3450 Corporate Identity 】 KMP(暴力)
- POJ 题目3080 Blue Jeans(KMP+暴力)
- poj 3080 Blue Jeans 【kmp+暴力】