【hdu 2087】剪花布条
程序员文章站
2022-06-04 15:39:32
...
今天去刷了一下前几届学长大一时的周赛题,主要收获是学了点string类的基本用法。
题目链接:传送门
剪花布条
Problem Description
一块花布条,里面有些图案,另有一块直接可用的小饰条,
里面也有一些图案。对于给定的花布条和小饰条,
计算一下能从花布条中尽可能剪出几块小饰条来呢?
Input
输入中含有一些数据,分别是成对出现的花布条和小饰条,
其布条都是用可见ASCII字符表示的,可见的ASCII字符有多少个,
布条的花纹也有多少种花样。花纹条和小饰条不会超过1000个
字符长。如果遇见#字符,则不再进行工作。
Output
输出能从花纹布中剪出的最多小饰条个数,如果一块都没有,
那就老老实实输出0,每个结果之间应换行。
Sample Input
abcde a3
aaaaaa aa
#
Sample Output
0
3
暴力AC代码:
#include <stdio.h>
#include <cstring>
#include <iostream>
#include <string>
#include <cmath>
#include <algorithm>
#include <cstdlib>
#include <queue>
using namespace std;
#define ll long long
char p[1005];
char q[1005];
int main()
{
int ans, k;
while (cin >> p)
{
if (p[0] == '#')
break;
cin >> q;
ans = k = 0;
for (int i = 0; i < strlen(p); i++)
{
k = 0;
for (int j = 0; j < strlen(q); j++)
{
if (p[j + i] == q[j])
k++;
else
break;
if (k == strlen(q))
ans++, i += strlen(q) - 1;
}
}
cout << ans << endl;
}
return 0;
}
然后我看了一下别人发的题解,发现了一种KMP算法,但是十分的繁琐,另外使用比较多的方法就是用string类完成。
主要还是记录一下string类的一点函数和用法。
一.string.size()和string.length()作用完全一样,都是返回字符串的长度。
二.string.assign的用法
现有一个string类
变量a
且a="HELLO WORLD !"
1.直接用一字符串a给另一字符串b赋值
如 b.assign(a);
2.用一个字符串a的子串给另一字符串b赋值
如 b.assign(a,2,7);(从2开始,往后7个字符)
3.用n个字符x给字符串b赋值
如 b.assign(10,‘Y’);
运行效果如下:
知道这些string类的基本用法后这题就显得十分简单,解法也很清晰,就是每次取出长度为"小饰条"长度的花布条与"小饰条"比较,是否一样。
AC代码如下:
#include <stdio.h>
#include <cstring>
#include <iostream>
#include <string>
#include <cmath>
#include <algorithm>
#include <cstdlib>
#include <queue>
#include <cstring>
using namespace std;
#define ll long long
int main()
{
string a, b, c;
while (cin >> a)
{
int ans = 0;
if (a[0] == '#')
break;
cin >> b;
int len = b.size();
for (int i = 0; i <= a.size() - len; i++)
{
c.assign(a, i, len); //取出长度为len的花布条
if (c == b)
{
ans++;
i += len - 1;
}
}
cout << ans << endl;
}
return 0;
}