hdu5782
官方题解不是很详细
首先有一个结论:若A=pa+sa B=pb+sb
A、B串循环同构,则可以构造一个可行方案(pa,sb) (sa,pb)中有一个是最长匹配,这个不难用反证法证明。
对于s1,s2串,我们穷举s1的每一个后缀i,设s1[i..i+len-1]=s2[0..len-1] len是最长匹配
那么不难得到,如果存在k使得k<=len且s1[0..i-1]=s2[k..k+i-1]
那么,两串前缀s1[0..i+k-1]为循环同构
因此我们预处理w[i][j]表示s1[0..i]=s2[j..j+i]是否相等,w数组我们可用bitset压位存储
求出这个数组我们只需要建立后缀数组然后顺着height[]找即可
下面我们在将变量代换,前缀p=i+k-1循环同构的条件为i-1<=p<=len+i-1且w[i-1][p]为1
这个条件我们在压位的情况下可以用位运算处理
问题得解
#include<bits/stdc++.h> using namespace std;
bitset<> w[],ans,pre[],tmp;
char s2[],s1[];
int d[],lg[],h[],s[],rk[],sa[],x[],y[],a[];
int f[][],n;
pair<int,int> q[];
bool cmp(int a,int b,int j)
{
if (y[a]==y[b])
{
if (a+j<=n&&b+j<=n) return y[a+j]!=y[b+j];
else if (a+j>n&&b+j>n) return ;
else return ;
}
return y[a]!=y[b];
} void suffix()
{
int m=;
memset(s,,sizeof(s));
for (int i=; i<=n; i++) s[a[i]]++;
for (int i=; i<=m; i++) s[i]+=s[i-];
for (int i=n; i; i--) sa[s[a[i]]--]=i;
int p=; rk[sa[]]=;
for (int i=; i<=n; i++)
{
if (a[sa[i]]!=a[sa[i-]]) ++p;
rk[sa[i]]=p;
}
int j=; m=p;
while (m<n)
{
memcpy(y,rk,sizeof(rk));
memset(s,,sizeof(s));
p=;
for (int i=n-j+; i<=n; i++) x[++p]=i;
for (int i=; i<=n; i++)
if (sa[i]>j) x[++p]=sa[i]-j;
for (int i=; i<=n; i++) s[rk[i]=y[x[i]]]++;
for (int i=; i<=m; i++) s[i]+=s[i-];
for (int i=n; i; i--) sa[s[rk[i]]--]=x[i];
rk[sa[]]=; p=;
for (int i=; i<=n; i++)
{
if (cmp(sa[i],sa[i-],j)) ++p;
rk[sa[i]]=p;
}
m=p; j<<=;
}
p=; h[]=;
for (int i=; i<=n; i++)
{
if (rk[i]==) continue;
int j=sa[rk[i]-];
while (i+p<=n&&j+p<=n&&a[i+p]==a[j+p]) ++p;
h[rk[i]]=p;
if (p) p--;
}
} int ask(int x,int y)
{
int k=lg[y-x+];
return min(f[x][k],f[y-d[k]+][k]);
} void rmq()
{
for (int i=; i<=n; i++)
f[i][]=h[i];
for (int j=; j<=lg[n]; j++)
{
for (int i=; i<=n; i++)
if (i+d[j]-<=n) f[i][j]=min(f[i][j-],f[i+d[j-]][j-]);
else break;
}
} int main()
{
// freopen("1002.in","r",stdin);
d[]=; lg[]=;
for (int i=; i<=; i++)
{
d[i]=d[i-]*;
for (int j=d[i-]; j<=min(,d[i]-); j++) lg[j]=i-;
}
pre[][]=;
for (int i=; i<; i++)
{
pre[i]=pre[i-];
pre[i][i]=;
}
while (scanf("%s%s",s1,s2)!=EOF)
{
int l=strlen(s1);
n=;
for (int i=; i<l; i++) a[++n]=s1[i]-'a'+;
a[++n]=;
for (int i=; i<l; i++) a[++n]=s2[i]-'a'+;
a[n+]=;
suffix(); rmq();
for (int i=; i<l; i++) w[i].reset();
int len=n,m=;
for (int i=rk[]+; i<=n; i++)
{
len=min(len,h[i]);
if (!len) break;
else if (sa[i]>l+) q[++m]=make_pair(len-,sa[i]-l-);
}
len=h[rk[]];
for (int i=rk[]-; i; i--)
{
if (!len) break;
else if (sa[i]>l+) q[++m]=make_pair(len-,sa[i]-l-);
len=min(len,h[i]);
}
sort(q+,q++m);
tmp.reset(); int j=m;
for (int i=l-; i>=; i--)
{
while (j&&q[j].first==i) tmp[q[j--].second]=;
w[i]=tmp;
}
ans.reset();
for (int i=; i<l; i++)
{
int x=rk[i+],y=rk[l+];
if (x>y) swap(x,y);
len=ask(x+,y);
if (len)
{
if (i) ans|=(pre[i-]^pre[i+len-])&(w[i-]<<(i-));
else ans|=pre[len-];
}
}
for (int i=; i<l; i++)
if (ans[i]) printf(""); else printf("");
puts("");
}
}
hdu5782的更多相关文章
随机推荐
- 软银开放Pepper开发,给机器人写安卓App是怎样一种体验?
日本软银推出的Pepper智能机器人 新浪科技讯 北京时间5月19日下午消息,谷歌Android移动操作系统的触角正在不断扩大,从今天开始,开发者可以为日本电信公司软银的Pepper人形机器人设计An ...
- Windows不能用鼠标双击运行jar文件
Java应用程序jar文件可以由 JVM(Java虚拟机)直接执行,只要操作系统安装了JVM便可以运行作为Java应用程序的jar文件.可是,很多朋友遇到一个难题,那就是下载了jar文件以后在Wind ...
- Java八种基本数据类型的大小,以及封装类,自动装箱/拆箱的用法?
参考:http://blog.csdn.net/mazhimazh/article/details/16799925 1. Java八种基本数据类型的大小,以及封装类,自动装箱/拆箱的用法? 原始类型 ...
- UVA11426
链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=26&page ...
- Item 8 覆盖equals时请遵守通用约定
在覆盖equals方法的时候,你必须要遵守它的通用约定,不遵守,写出来的方法,会出现逻辑错误.下面是约定的内容: equals方法实现了等价关系: 自反性.对于任何非null的引用值,x.eq ...
- Kubernetes: 集群网络配置 - flannel
参考: [ Kubernetes 权威指南 ] Kubernetes 集群搭建可以参考 [ Kubernetes : 多节点 k8s 集群实践 ] 在多个 Node 组成的 Kubernetes 集群 ...
- java springmvc4 图片或文件上传
1.文件配置 配置文件解析 上传文件处理的核心方法 // uploadOneFile.jsp, uploadMultiFile.jsp submit to. @RequestMapping(value ...
- css优先级机制
所谓CSS优先级,即是指CSS样式在浏览器中被解析的先后顺序. 1.important >(内联样式)Inline style >(内部样式)Internal style sheet ...
- Centos修改镜像为国内的阿里云源或者163源等国内源
阿里安装软件镜像源 阿里云Linux安装镜像源地址:http://mirrors.aliyun.com/ 第一步:备份你的原镜像文件,以免出错后可以恢复. mv /etc/yum.repos.d/Ce ...
- 【转】关于Scapy
关于Scapy Scapy的是一个强大的交互式数据包处理程序(使用python编写).它能够伪造 或者解码大量的网络协议数据包,能够发送.捕捉.匹配请求和回复包等等.它可以很容易地处理一些典型操作,比 ...