| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
ACKMP好题,感谢http://blog.csdn.net/xiaoxiaoluo/article/details/7475857与http://www.cppblog.com/zxb/archive/2010/10/06/128782.aspx?opt=admin
#include<cstdio>
#include<cstring>
const int N=250100;
const int M=1000100;
int n,m,s;
int a[N],b[M];
int hash[300],low[N],high[N],f[N];
int ans_num,ans[M];
bool check (int *a,int *b,int k)
{
if(b[hash[a[k]]]!=b[k])
return false;
if(low[k]>=0&&b[low[k]]>=b[k])
return false;
if(high[k]>=0&&b[high[k]]<=b[k])
return false;
return true;
}
void make ()
{
int i=1,j=-1;
f[0]=-1;
for (;i<m;i++)
{
while (j!=-1&&check(b,b+i-j-1,j+1)==false) j=f[j];
if (check(b,b+i-j-1,j+1)==true) j++;
f[i]=j;
}
return ;
}
void get_ans()
{
int i=0,j=-1;
for (;i<n;i++)
{
while (j!=-1&&check(b,a+i-j-1,j+1)==false) j=f[j];
if (check(b,a+i-j-1,j+1)==true) j++;
if (j+1>=m)
{
ans_num++;
ans[ans_num]=i-j+1;
j=f[j];
}
}
return ;
}
int main()
{
ans_num=0;
scanf("%d%d%d",&n,&m,&s);
for (int u=0;u<n;u++)
scanf("%d",&a[u]);
memset(hash,-1,sizeof(hash));
hash[0]=hash[s+1]=-2;
for (int u=0;u<m;u++)
{
scanf("%d",&b[u]);
if (hash[b[u]]==-1)
hash[b[u]]=u;
int i;
for (i=b[u]-1;hash[i]==-1;i--);
low[u]=hash[i];
for (i=b[u]+1;hash[i]==-1;i++);
high[u]=hash[i];
}
make();
get_ans();
printf("%d\n",ans_num);
for (int u=1;u<=ans_num;u++) printf("%d\n",ans[u]);
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator