hdu 5918 Harmonic Value Description 2016ACM/CCPC长春赛区现场赛H
2016-10-08 19:26
316 查看
Problem Description
Mr. Frog has two sequences a1,a2,⋯,an and b1,b2,⋯,bm and
a number p. He wants to know the number of positions q such that sequence b1,b2,⋯,bm is
exactly the sequence aq,aq+p,aq+2p,⋯,aq+(m−1)p where q+(m−1)p≤n and q≥1.
Input
The first line contains only one integer T≤100,
which indicates the number of test cases.
Each test case contains three lines.
The first line contains three space-separated integers 1≤n≤106,1≤m≤106 and 1≤p≤106.
The second line contains n integers a1,a2,⋯,an(1≤ai≤109).
the third line contains m integers b1,b2,⋯,bm(1≤bi≤109).
Output
For each test case, output one line “Case #x: y”, where x is the case number (starting from 1) and y is the number of valid q’s.
Sample Input
2
6 3 1
1 2 3 1 2 3
1 2 3
6 3 2
1 3 2 2 3 1
1 2 3
Sample Output
Case #1: 2
Case #2: 1
将a数列的元素按照对p取模的值重新排列,构成新的数列,不同取模值之间加上一个-1作为分界
然后直接跑KMP即可
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
int a[200001],aa[100001],b[100001];
int loc[100001],net[100001];
int n,m;
inline void KMP()
{
int i,j;
for(i=1;i<m;i++)
{
j=i;
while(j>0)
{
j=net[j];
if(b[j]==b[i])
{
net[i+1]=j+1;
break;
}
}
}
for(i=0,j=0;i<n;i++)
{
if(j<m&&a[i]==b[j])
j++;
else
{
while(j>0)
{
j=net[j];
if(a[i]==b[j])
{
j++;
break;
}
}
}
if(j==m)
{
loc[0]++;
loc[loc[0]]=(i-m+1)+1;
}
}
}
int main()
{
int T,k=0;
scanf("%d",&T);
while(T>0)
{
T--;
k++;
int p;
scanf("%d%d%d",&n,&m,&p);
int i,j;
for(i=0;i<n;i++)
scanf("%d",&aa[i]);
for(i=0;i<m;i++)
scanf("%d",&b[i]);
int tot=-1;
for(i=0;i<p;i++)
{
for(j=i;j<n;j+=p)
{
tot++;
a[tot]=aa[j];
}
tot++;
a[tot]=-1;
}
// for(i=0;i<=tot;i++)
// printf("%d ",a[i]);
// printf("\n");
memset(net,0,sizeof(net));
loc[0]=0;
n=tot+1;
KMP();
printf("Case #%d: %d\n",k,loc[0]);
}
return 0;
}
Mr. Frog has two sequences a1,a2,⋯,an and b1,b2,⋯,bm and
a number p. He wants to know the number of positions q such that sequence b1,b2,⋯,bm is
exactly the sequence aq,aq+p,aq+2p,⋯,aq+(m−1)p where q+(m−1)p≤n and q≥1.
Input
The first line contains only one integer T≤100,
which indicates the number of test cases.
Each test case contains three lines.
The first line contains three space-separated integers 1≤n≤106,1≤m≤106 and 1≤p≤106.
The second line contains n integers a1,a2,⋯,an(1≤ai≤109).
the third line contains m integers b1,b2,⋯,bm(1≤bi≤109).
Output
For each test case, output one line “Case #x: y”, where x is the case number (starting from 1) and y is the number of valid q’s.
Sample Input
2
6 3 1
1 2 3 1 2 3
1 2 3
6 3 2
1 3 2 2 3 1
1 2 3
Sample Output
Case #1: 2
Case #2: 1
将a数列的元素按照对p取模的值重新排列,构成新的数列,不同取模值之间加上一个-1作为分界
然后直接跑KMP即可
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
int a[200001],aa[100001],b[100001];
int loc[100001],net[100001];
int n,m;
inline void KMP()
{
int i,j;
for(i=1;i<m;i++)
{
j=i;
while(j>0)
{
j=net[j];
if(b[j]==b[i])
{
net[i+1]=j+1;
break;
}
}
}
for(i=0,j=0;i<n;i++)
{
if(j<m&&a[i]==b[j])
j++;
else
{
while(j>0)
{
j=net[j];
if(a[i]==b[j])
{
j++;
break;
}
}
}
if(j==m)
{
loc[0]++;
loc[loc[0]]=(i-m+1)+1;
}
}
}
int main()
{
int T,k=0;
scanf("%d",&T);
while(T>0)
{
T--;
k++;
int p;
scanf("%d%d%d",&n,&m,&p);
int i,j;
for(i=0;i<n;i++)
scanf("%d",&aa[i]);
for(i=0;i<m;i++)
scanf("%d",&b[i]);
int tot=-1;
for(i=0;i<p;i++)
{
for(j=i;j<n;j+=p)
{
tot++;
a[tot]=aa[j];
}
tot++;
a[tot]=-1;
}
// for(i=0;i<=tot;i++)
// printf("%d ",a[i]);
// printf("\n");
memset(net,0,sizeof(net));
loc[0]=0;
n=tot+1;
KMP();
printf("Case #%d: %d\n",k,loc[0]);
}
return 0;
}
相关文章推荐
- hdu 5916 Harmonic Value Description 2016ACM/CCPC长春赛区现场赛F
- HDU 5916 Harmonic Value Description 【构造】(2016中国大学生程序设计竞赛(长春))
- HDU 5916 Harmonic Value Description 【构造】(2016中国大学生程序设计竞赛(长春))
- hdu 5912 Fractionl 2016ACM/CCPC长春赛区现场赛B
- hdu 5914 Triangle 2016ACM/CCPC长春赛区现场赛D
- HDU Harmonic Value Description 2016中国大学生程序设计竞赛(长春)-重现赛
- hdu 5919 Sequence II 2016ACM/CCPC长春赛区现场赛J
- hdu 5920 Ugly Problem 2016ACM/CCPC长春赛区现场赛J
- HDU 5916 Harmonic Value Description (2016-ccpc-长春)
- hdu 5916 Harmonic Value Description-思维题-2016中国大学生程序设计竞赛(长春)-重现赛
- HDU 5916 Harmonic Value Description【构造】【2016中国大学生程序设计竞赛(长春)】
- HDU 5916 Harmonic Value Description【思维构造题目】(2016中国大学生程序设计竞赛(长春)F题)
- HDOJ 5916 Harmonic Value Description 【2016CCPC长春现场赛】数学+构造
- HDU 4814 Golden Radio Base(2013 ACM/ICPC 长春赛区现场赛)
- HDU 5916 Harmonic Value Description (构造)
- hdu 5916 Harmonic Value Description
- HDU 5916 - Harmonic Value Description
- hdu 5963 朋友 2016ACM/CCPC合肥赛区现场赛C
- hdu 5916 Harmonic Value Description 最大公约数
- HDU 5532 2015ACM-ICPC长春赛区现场赛F题