【EXKMP】【2015-2】day1 T3 字符串转换
2015-01-30 22:03
176 查看
哈哈这题乱搞骗了个AC~~~~~~
留个字符串hash模板
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
#define rep(i,l,r) for(int i=(l),_=(r);i<=_;i++)
#define per(i,r,l) for(int i=(r),_=(l);i>=_;i--)
#define MS(arr,x) memset(arr,x,sizeof(arr))
#define INE(i,u) for(int i=head[u];~i;i=e[i].next)
#define LL long long
#define ULL unsigned LL
inline const int read()
{int r=0,k=1;char c=getchar();for(;c<'0'||c>'9';c=getchar())if(c=='-')k=-1;
for(;c>='0'&&c<='9';c=getchar())r=r*10+c-'0';return k*r;}
////////////////////////////////////////////////
const int base=131;
int n;
char a[1000010],b[1000010];
int next[1000010];
int ansl=1,ansr=-1;
ULL ha[1000010],hb[1000010];
ULL pm[1000010];
////////////////////////////////////////////////
ULL hasha(int l,int r)
{
return ha[r]-ha[l-1]*pm[r-l+1];
}
ULL hashb(int l,int r)
{
return hb[l]-hb[r+1]*pm[r-l+1];
}
bool check(int l,int r)
{
int l1=r-l+1,l2=n-r+1,l3=n-l1-l2;
return hasha(r+1,n) == hashb(l1+1,l1+l2-1) && hasha(1,l-1) == hashb(n-l3,n);
}
void init_hash()
{
rep(i,1,n) ha[i]=ha[i-1]*base+a[i];
per(i,n,1) hb[i]=hb[i+1]*base+b[i];
}
void init_next()
{
int j=0;
rep(i,2,n)
{
while(j&&b[i]!=b[j+1]) j=next[j];
next[i]=j+=b[i]==b[j+1];
}
}
void kmp()
{
int j=0;
rep(i,1,n)
{
while(j&&a[i]!=b[j+1]) j=next[j];
j+=a[i]==b[j+1];
int l=i-j+1,r=i;
if(l>ansl || l==ansl&&r<ansr)
{
if(check(l,r))
{
ansl=l;
ansr=r;
}
}
}
}
////////////////////////////////////////////////
void input()
{
gets(a+1); gets(b+1);
n=strlen(a+1);
}
void solve()
{
pm[0]=1; rep(i,1,n) pm[i]=pm[i-1]*base;
init_hash();
init_next();
kmp();
printf("%d %d\n",ansl-2,ansr);
}
////////////////////////////////////////////////
int main()
{
freopen("trans.in","r",stdin); freopen("trans.out","w",stdout);
input(),solve();
return 0;
}
放两个EXKMP代码,慢慢看
#include <map> #include <cmath> #include <cstdio> #include <vector> #include <string> #include <cstdlib> #include <cstring> #include <sstream> #include <fstream> #include <iostream> #include <algorithm> #define PB push_back #define MP make_pair #define BG begin() #define ED end() #define SZ(x) ((int)((x).size())) #define FF first #define SS second #define foreach(i,x) for (__typeof((x).begin()) i=(x).begin();i!=(x).end();i++) #define FOR(i,l,r) for (int i=(l);i<=(r);i++) #define ROF(i,r,l) for (int i=(r);i>=(l);i--) using namespace std; #define N 2010000 char _a ,_b ; int g1 ,g2 ; void cal(string a,int f[]) { f[1]=0; while (a[f[1]]==a[f[1]+1]) f[1]++; int mx=1,n=SZ(a); FOR(i,2,n-1) { if (f[mx]+mx>i) f[i]=min(f[i-mx],f[mx]+mx-i); else f[i]=0; while (a[f[i]]==a[f[i]+i]) f[i]++; if (f[i]+i>f[mx]+mx) mx=i; }; } #define fly "" int main() { freopen("trans"fly".in","r",stdin); freopen("trans"fly".out","w",stdout); gets(_a); gets(_b); string a(_a),b(_b); int n=SZ(a); if (SZ(b)!=n) {puts("-1 -1");return 0;}; string fa(a),fb(b); FOR(i,0,n-1) b[i]=_b[n-i-1]; FOR(i,0,n-1) fa[i]=_a[n-i-1]; cal(fb+a,g1); cal(fa+fb,g2); FOR(i,0,n-1) g1[i]=g1[i+n]; FOR(i,0,n-1) g2[i]=i-g2[2*n-1-i]; ROF(i,n-2,0) g2[i]=min(g2[i],g2[i+1]); int x=-1,y=-1; g1 =0; FOR(i,0,n-2) if (a[i]!=b[i]) break; else { int l=n-1-g1[i+1],r=n-1; if (g2[l]>i) continue; while (l<r) { int mid=(l+r+1)>>1; if (g2[mid]<=i) l=mid; else r=mid-1; }; if (g2[l]<=i) x=i,y=i+n-l; }; printf("%d %d\n",x,y); return 0; }
留个字符串hash模板
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
#define rep(i,l,r) for(int i=(l),_=(r);i<=_;i++)
#define per(i,r,l) for(int i=(r),_=(l);i>=_;i--)
#define MS(arr,x) memset(arr,x,sizeof(arr))
#define INE(i,u) for(int i=head[u];~i;i=e[i].next)
#define LL long long
#define ULL unsigned LL
inline const int read()
{int r=0,k=1;char c=getchar();for(;c<'0'||c>'9';c=getchar())if(c=='-')k=-1;
for(;c>='0'&&c<='9';c=getchar())r=r*10+c-'0';return k*r;}
////////////////////////////////////////////////
const int base=131;
int n;
char a[1000010],b[1000010];
int next[1000010];
int ansl=1,ansr=-1;
ULL ha[1000010],hb[1000010];
ULL pm[1000010];
////////////////////////////////////////////////
ULL hasha(int l,int r)
{
return ha[r]-ha[l-1]*pm[r-l+1];
}
ULL hashb(int l,int r)
{
return hb[l]-hb[r+1]*pm[r-l+1];
}
bool check(int l,int r)
{
int l1=r-l+1,l2=n-r+1,l3=n-l1-l2;
return hasha(r+1,n) == hashb(l1+1,l1+l2-1) && hasha(1,l-1) == hashb(n-l3,n);
}
void init_hash()
{
rep(i,1,n) ha[i]=ha[i-1]*base+a[i];
per(i,n,1) hb[i]=hb[i+1]*base+b[i];
}
void init_next()
{
int j=0;
rep(i,2,n)
{
while(j&&b[i]!=b[j+1]) j=next[j];
next[i]=j+=b[i]==b[j+1];
}
}
void kmp()
{
int j=0;
rep(i,1,n)
{
while(j&&a[i]!=b[j+1]) j=next[j];
j+=a[i]==b[j+1];
int l=i-j+1,r=i;
if(l>ansl || l==ansl&&r<ansr)
{
if(check(l,r))
{
ansl=l;
ansr=r;
}
}
}
}
////////////////////////////////////////////////
void input()
{
gets(a+1); gets(b+1);
n=strlen(a+1);
}
void solve()
{
pm[0]=1; rep(i,1,n) pm[i]=pm[i-1]*base;
init_hash();
init_next();
kmp();
printf("%d %d\n",ansl-2,ansr);
}
////////////////////////////////////////////////
int main()
{
freopen("trans.in","r",stdin); freopen("trans.out","w",stdout);
input(),solve();
return 0;
}
放两个EXKMP代码,慢慢看
#include <map> #include <cmath> #include <cstdio> #include <vector> #include <string> #include <cstdlib> #include <cstring> #include <sstream> #include <fstream> #include <iostream> #include <algorithm> #define PB push_back #define MP make_pair #define BG begin() #define ED end() #define SZ(x) ((int)((x).size())) #define FF first #define SS second #define foreach(i,x) for (__typeof((x).begin()) i=(x).begin();i!=(x).end();i++) #define FOR(i,l,r) for (int i=(l);i<=(r);i++) #define ROF(i,r,l) for (int i=(r);i>=(l);i--) using namespace std; #define N 2010000 char _a ,_b ; int g1 ,g2 ; void cal(string a,int f[]) { f[1]=0; while (a[f[1]]==a[f[1]+1]) f[1]++; int mx=1,n=SZ(a); FOR(i,2,n-1) { if (f[mx]+mx>i) f[i]=min(f[i-mx],f[mx]+mx-i); else f[i]=0; while (a[f[i]]==a[f[i]+i]) f[i]++; if (f[i]+i>f[mx]+mx) mx=i; }; } #define fly "" int main() { freopen("trans"fly".in","r",stdin); freopen("trans"fly".out","w",stdout); gets(_a); gets(_b); string a(_a),b(_b); int n=SZ(a); if (SZ(b)!=n) {puts("-1 -1");return 0;}; string fa(a),fb(b); FOR(i,0,n-1) b[i]=_b[n-i-1]; FOR(i,0,n-1) fa[i]=_a[n-i-1]; cal(fb+a,g1); cal(fa+fb,g2); FOR(i,0,n-1) g1[i]=g1[i+n]; FOR(i,0,n-1) g2[i]=i-g2[2*n-1-i]; ROF(i,n-2,0) g2[i]=min(g2[i],g2[i+1]); int x=-1,y=-1; g1 =0; FOR(i,0,n-2) if (a[i]!=b[i]) break; else { int l=n-1-g1[i+1],r=n-1; if (g2[l]>i) continue; while (l<r) { int mid=(l+r+1)>>1; if (g2[mid]<=i) l=mid; else r=mid-1; }; if (g2[l]<=i) x=i,y=i+n-l; }; printf("%d %d\n",x,y); return 0; }
#include <map> #include <cmath> #include <cstdio> #include <vector> #include <string> #include <cstdlib> #include <cstring> #include <sstream> #include <fstream> #include <iostream> #include <algorithm> #define PB push_back #define MP make_pair #define BG begin() #define ED end() #define SZ(x) ((int)((x).size())) #define FF first #define SS second #define foreach(i,x) for (__typeof((x).begin()) i=(x).begin();i!=(x).end();i++) #define FOR(i,l,r) for (int i=(l);i<=(r);i++) #define ROF(i,r,l) for (int i=(r);i>=(l);i--) using namespace std; #define N 2010000 char _a ,_b ; int g1 ,g2 ; void cal(string a,int f[]) { f[1]=0; while (a[f[1]]==a[f[1]+1]) f[1]++; int mx=1,n=SZ(a); FOR(i,2,n-1) { if (f[mx]+mx>i) f[i]=min(f[i-mx],f[mx]+mx-i); else f[i]=0; while (a[f[i]]==a[f[i]+i]) f[i]++; if (f[i]+i>f[mx]+mx) mx=i; }; } #define fly "" int main() { freopen("trans"fly".in","r",stdin); freopen("trans"fly".out","w",stdout); gets(_a); gets(_b); string a(_a),b(_b); int n=SZ(a); if (SZ(b)!=n) {puts("-1 -1");return 0;}; string fa(a),fb(b); FOR(i,0,n-1) b[i]=_b[n-i-1]; FOR(i,0,n-1) fa[i]=_a[n-i-1]; cal(fb+a,g1); cal(fa+fb,g2); FOR(i,0,n-1) g1[i]=g1[i+n]; FOR(i,0,n-1) g2[i]=i-g2[2*n-1-i]; ROF(i,n-2,0) g2[i]=min(g2[i],g2[i+1]); int x=-1,y=-1; g1 =0; FOR(i,0,n-2) if (a[i]!=b[i]) break; else { int l=n-1-g1[i+1],r=n-1; if (g2[l]>i) continue; while (l<r) { int mid=(l+r+1)>>1; if (g2[mid]<=i) l=mid; else r=mid-1; }; if (g2[l]<=i) x=i,y=i+n-l; }; printf("%d %d\n",x,y); return 0; }
相关文章推荐
- 【NOIP2015 DAY1 T3 】斗地主(landlords)
- 洛谷P2668 斗地主==codevs 4610 斗地主[NOIP 2015 day1 T3]
- C++——NOIP2015提高组day1 t3——斗地主
- 斗地主 (NOIP2015 Day1 T3)
- bzoj 4010 [HNOI 2015 Day1 T3] 分类: bzoj 2015-05-27 22:25 31人阅读 评论(0) 收藏
- bzoj 4010 [HNOI 2015 Day1 T3]
- Noip2015 Day1 T3 斗地主(Dfs+Dp优化)
- 配置安装Python+安装常用函数库——DAY1_2015_05_20
- NOIP 2015 提高组 Day1
- NOI2015 Day1
- bzoj4035: [HAOI2015]T3
- 洛谷P2671 NOIP2015普及组 T3 求和
- 【NOIP 2015 Day1 T2】信息传递(dfs || 拓扑排序 || Tarjan)
- 济南学习 Day1 T3 pm
- Noip2011 提高组 Day1 T3 Mayan游戏
- NOIP2015PJ T3,T4题解
- Noip 2013 Day1 T3 货车运输 启发式并查集树
- bzoj4195 noi2015 day1 t1
- java2015视频day1集合
- Noip2013 Day1 T3 货车运输(树上倍增)