hdu 5745 La Vie en rose(2016 Multi-University Training Contest 2——暴力)
2016-07-23 14:34
549 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5745
Time Limit: 14000/7000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 949 Accepted Submission(s): 516
Problem Description
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.
Input
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.
Output
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.
Sample Input
3
4 1
abac
a
4 2
aaaa
aa
9 3
abcbacacb
abc
Sample Output
1010
1110
100100100
Author
zimpha
Source
2016 Multi-University Training Contest 2
题目大意:给你一个长为n的串A和一个长为m的串B,然后从头开始匹配,如果可以匹配,则当前输出1,如果不能输出0,可以在B串中选取一些下标ij,其中|ij−ij+1|>1,每次可以选择Pij和Pij+1交换。
解题思路:
我们采用pre的方法进行标记前一状态。分为以下三种:
1、pre=0;表示和当前位置正好匹配成功
2、pre=1;表示和后一位匹配成功
3、pre=-1;表示和前一位匹配成功
根据pre的状态就可以知道是否两个字符串可以匹配成功。
因为第一位只可能是和当前位匹配或者和后一位匹配,最后一位就只能是当前位和前一位是否匹配。
而加在两位中间的就是以上三种情况。
通过这样一位一位的查找,如果能够成功,循环就会结束、j>=m,就输出1,否则,输出0;
详见代码。
#include <iostream>
#include <cstdio>
using namespace std;
char ch1[100010],ch2[5010];
int main()
{
int t,pre;
scanf("%d",&t);
while (t--)
{
int n,m;
scanf("%d%d",&n,&m);
scanf("%s%s",ch1,ch2);
for (int i=0; i<n; i++)//ch1的起点
{
if (ch1[i]==ch2[0])
pre=0;
else if (ch1[i]==ch2[1])
pre=1;
else
{
//cout<<1<<endl;
printf ("0");
continue;
}
int k=i+1,j;
for (j=1; j<m; j++,k++)//ch2
{
if (pre==0||pre==-1)
{
if (ch1[k]==ch2[j])
{
pre=0;
}
else if (j<m-1&&ch1[k]==ch2[j+1])
{
pre=1;
}
else
break;
}
else if (pre==1)
{
if (ch1[k]==ch2[j-1])
pre=-1;
else
break;
}
}
if (j>=m)
printf ("1");
else
printf ("0");
}
printf("\n");
}
return 0;
}
|ij−ij+1|>1
|ij−ij+1|>1
La Vie en rose
Time Limit: 14000/7000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 949 Accepted Submission(s): 516
Problem Description
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.
Input
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.
Output
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.
Sample Input
3
4 1
abac
a
4 2
aaaa
aa
9 3
abcbacacb
abc
Sample Output
1010
1110
100100100
Author
zimpha
Source
2016 Multi-University Training Contest 2
题目大意:给你一个长为n的串A和一个长为m的串B,然后从头开始匹配,如果可以匹配,则当前输出1,如果不能输出0,可以在B串中选取一些下标ij,其中|ij−ij+1|>1,每次可以选择Pij和Pij+1交换。
解题思路:
我们采用pre的方法进行标记前一状态。分为以下三种:
1、pre=0;表示和当前位置正好匹配成功
2、pre=1;表示和后一位匹配成功
3、pre=-1;表示和前一位匹配成功
根据pre的状态就可以知道是否两个字符串可以匹配成功。
因为第一位只可能是和当前位匹配或者和后一位匹配,最后一位就只能是当前位和前一位是否匹配。
而加在两位中间的就是以上三种情况。
通过这样一位一位的查找,如果能够成功,循环就会结束、j>=m,就输出1,否则,输出0;
详见代码。
#include <iostream>
#include <cstdio>
using namespace std;
char ch1[100010],ch2[5010];
int main()
{
int t,pre;
scanf("%d",&t);
while (t--)
{
int n,m;
scanf("%d%d",&n,&m);
scanf("%s%s",ch1,ch2);
for (int i=0; i<n; i++)//ch1的起点
{
if (ch1[i]==ch2[0])
pre=0;
else if (ch1[i]==ch2[1])
pre=1;
else
{
//cout<<1<<endl;
printf ("0");
continue;
}
int k=i+1,j;
for (j=1; j<m; j++,k++)//ch2
{
if (pre==0||pre==-1)
{
if (ch1[k]==ch2[j])
{
pre=0;
}
else if (j<m-1&&ch1[k]==ch2[j+1])
{
pre=1;
}
else
break;
}
else if (pre==1)
{
if (ch1[k]==ch2[j-1])
pre=-1;
else
break;
}
}
if (j>=m)
printf ("1");
else
printf ("0");
}
printf("\n");
}
return 0;
}
|ij−ij+1|>1
|ij−ij+1|>1
相关文章推荐
- 2016 Multi-University Training Contest 1 1005 Necklace (hdu5727)【枚举+匹配】
- poj Raising Modulo Numbers 【快速幂 + 模取余】
- Contains Duplicate II
- 调用http://apistore.baidu.com网站的接口
- HDU5728 2016 Multi-University Training Contest 1 (递归+欧拉函数)
- http://blog.csdn.net/mindfloating/article/details/51534289
- UVA 11076-Add Again
- soft raid5阅读笔记之十四--resync和recovery的区别
- soft raid5阅读笔记之十三--异或操作
- soft raid5阅读笔记之十二--DMA相关
- 5. Longest Palindromic Substring && 214. Shortest Palindrome && 336. Palindrome Pairs
- soft raid5阅读笔记之十--状态标志
- soft raid5阅读笔记之九--MD中的superblock
- 373. Find K Pairs with Smallest Sums && 378. Kth Smallest Element in a Sorted Matrix
- soft raid5阅读笔记之七--MD中的bitmap
- maven install时报错Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile
- Contains Duplicate
- POJ:1995 Raising Modulo Numbers(快速幂)
- 2016 Multi-University Training Contest 2 1006 Fantasia (hdu5739) 【割点 无向图dfs树 树形dp】
- 2016 Multi-university-training-contests-2 1006 点双连通分量