HDU 5745 La Vie en rose(简单模拟)
2016-07-22 13:14
344 查看
题目链接:HDU 5745
题面:
Total Submission(s): 567 Accepted Submission(s): 285
[align=left]Problem Description[/align]
Professor Zhang would like to solve the multiple pattern matching problem, but he only has only one pattern string
p=p1p2...pm.
So, he wants to generate as many as possible pattern strings from
p
using the following method:
1. select some indices i1,i2,...,ik
such that 1≤i1<i2<...<ik<|p|
and |ij−ij+1|>1
for all 1≤j<k.
2. swap pij
and pij+1
for all 1≤j≤k.
Now, for a given a string s=s1s2...sn,
Professor Zhang wants to find all occurrences of all the generated patterns in
s.
[align=left]Input[/align]
There are multiple test cases. The first line of input contains an integer
T,
indicating the number of test cases. For each test case:
The first line contains two integers n
and m
(1≤n≤105,1≤m≤min{5000,n})
-- the length of s
and p.
The second line contains the string s
and the third line contains the string p.
Both the strings consist of only lowercase English letters.
[align=left]Output[/align]
For each test case, output a binary string of length
n.
The i-th
character is "1" if and only if the substring sisi+1...si+m−1
is one of the generated patterns.
[align=left]Sample Input[/align]
3
4 1
abac
a
4 2
aaaa
aa
9 3
abcbacacb
abc
[align=left]Sample Output[/align]
1010
1110
100100100
[align=left]Author[/align]
zimpha
题意:
问给定一个原串,一个模式串,原串任意位置的一段连续子串是否能通过交换任意相邻两位得到,可以则输出1,不可以则输出0。
解题:
这题,纯暴力就能过,复杂度看似悬,但很难出数据卡住,或者可以理论上证明,是卡不住的,加一个前缀和的预判,大概能优化1s。如果,当前位和模式串位不同,只能和后一位交换,此时下标加2,若不能交换,则代表不行。
代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#define LL long long
#define sz 100005
using namespace std;
char s[sz],p[5005];
int num[sz][26],cnt[26];
int n,m;
int main()
{
int t,n,m;
bool flag;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
scanf("%s",s);
scanf("%s",p);
memset(cnt,0,sizeof(cnt));
for(int i=0;i<26;i++)
num[0][i]=0;
for(int i=1;i<=n;i++)
{
for(int j=0;j<26;j++)
num[i][j]=num[i-1][j];
num[i][s[i-1]-'a']++;
}
for(int i=0;i<m;i++)
cnt[p[i]-'a']++;
for(int i=0;i<=n-m;i++)
{
flag=1;
for(int j=0;j<26;j++)
{
if(cnt[j]!=num[i+m][j]-num[i][j])
{
flag=0;
break;
}
}
if(flag)
{
for(int j=0;j<m;j++)
{
if(s[i+j]==p[j])
continue;
else
{
if(j==m-1)
{
flag=0;
break;
}
if(s[i+j]==p[j+1]&&s[i+j+1]==p[j])
{
j++;
}
else
{
flag=0;
break;
}
}
}
}
if(flag)
printf("1");
else
printf("0");
}
for(int i=1;i<m;i++)
printf("0");
printf("\n");
}
return 0;
}
题面:
La Vie en rose
Time Limit: 14000/7000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 567 Accepted Submission(s): 285
[align=left]Problem Description[/align]
Professor Zhang would like to solve the multiple pattern matching problem, but he only has only one pattern string
p=p1p2...pm.
So, he wants to generate as many as possible pattern strings from
p
using the following method:
1. select some indices i1,i2,...,ik
such that 1≤i1<i2<...<ik<|p|
and |ij−ij+1|>1
for all 1≤j<k.
2. swap pij
and pij+1
for all 1≤j≤k.
Now, for a given a string s=s1s2...sn,
Professor Zhang wants to find all occurrences of all the generated patterns in
s.
[align=left]Input[/align]
There are multiple test cases. The first line of input contains an integer
T,
indicating the number of test cases. For each test case:
The first line contains two integers n
and m
(1≤n≤105,1≤m≤min{5000,n})
-- the length of s
and p.
The second line contains the string s
and the third line contains the string p.
Both the strings consist of only lowercase English letters.
[align=left]Output[/align]
For each test case, output a binary string of length
n.
The i-th
character is "1" if and only if the substring sisi+1...si+m−1
is one of the generated patterns.
[align=left]Sample Input[/align]
3
4 1
abac
a
4 2
aaaa
aa
9 3
abcbacacb
abc
[align=left]Sample Output[/align]
1010
1110
100100100
[align=left]Author[/align]
zimpha
题意:
问给定一个原串,一个模式串,原串任意位置的一段连续子串是否能通过交换任意相邻两位得到,可以则输出1,不可以则输出0。
解题:
这题,纯暴力就能过,复杂度看似悬,但很难出数据卡住,或者可以理论上证明,是卡不住的,加一个前缀和的预判,大概能优化1s。如果,当前位和模式串位不同,只能和后一位交换,此时下标加2,若不能交换,则代表不行。
代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#define LL long long
#define sz 100005
using namespace std;
char s[sz],p[5005];
int num[sz][26],cnt[26];
int n,m;
int main()
{
int t,n,m;
bool flag;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
scanf("%s",s);
scanf("%s",p);
memset(cnt,0,sizeof(cnt));
for(int i=0;i<26;i++)
num[0][i]=0;
for(int i=1;i<=n;i++)
{
for(int j=0;j<26;j++)
num[i][j]=num[i-1][j];
num[i][s[i-1]-'a']++;
}
for(int i=0;i<m;i++)
cnt[p[i]-'a']++;
for(int i=0;i<=n-m;i++)
{
flag=1;
for(int j=0;j<26;j++)
{
if(cnt[j]!=num[i+m][j]-num[i][j])
{
flag=0;
break;
}
}
if(flag)
{
for(int j=0;j<m;j++)
{
if(s[i+j]==p[j])
continue;
else
{
if(j==m-1)
{
flag=0;
break;
}
if(s[i+j]==p[j+1]&&s[i+j+1]==p[j])
{
j++;
}
else
{
flag=0;
break;
}
}
}
}
if(flag)
printf("1");
else
printf("0");
}
for(int i=1;i<m;i++)
printf("0");
printf("\n");
}
return 0;
}
相关文章推荐
- 【HDU 5366】The mook jong 详解
- 【HDU 2136】Largest prime factor 详细图解
- 【HDU 1568】Fibonacci 数学公式 详解
- HDU 1568
- HDU1290
- HDU1568(Fobonacci公式)
- HDU ACM Step 2.2.2 Joseph(约瑟夫环问题)
- HDU 1405
- HDU 1297
- hdu 1205
- hdu 2087
- hdu 1016
- HDU 4898 The Revenge of the Princess’ Knight ( 2014 Multi-University Training Contest 4 )
- HDU 5592 ZYB's Premutation 线段树(查找动态区间第K大)
- HDU 5240 Exam (好水的题)
- HDU5237 Base64 大模拟
- HDU 1000
- HDU 1001
- HDU 1016 Prime Ring Problem
- HDU 1017 A Mathematical Curiosity