试题 算法训练 印章java
时间: 2023-09-23 14:09:39 浏览: 61
题目描述
小明有一个印章,印章上有n个字母。每个字母可以是A~Z中的任何一个大写字母。现在小明想要用这个印章印出一个长度为m的字符串。
但是印章每次只能印出一个长度为k的字符串,每个字母只能使用一次,且印章不能左右翻转使用。
请问小明最少需要印多少次才能完成这个任务。
输入格式
输入共两行。
第一行包含三个整数n,k,m,分别表示印章上的字母个数,印章每次印出的字符串长度,以及需要印出的字符串长度。
第二行包含一个长度为n的字符串,表示印章上的字母。
输出格式
输出一个整数,表示小明最少需要印多少次才能完成这个任务。
数据范围
1≤k≤m≤1000
1≤n≤26
样例
输入样例:
3 2 4
ABC
输出样例:
2
算法1
(动态规划) $O(n^2)$
时间复杂度
参考文献
Python3 代码
C++ 代码
Java 代码
算法2
(暴力枚举) $O(n^2)$
blablabla
时间复杂度
参考文献
C++ 代码
相关问题
java pdf加盖印章
在Java中,要给PDF文档加盖印章,可以使用一些开源的Java库,比如iText、Apache PDFBox等。这些库都提供了在PDF文档中添加印章的功能,可以通过调用相应的方法实现。
首先,需要创建一个PDF文档对象,然后使用库提供的方法在文档上创建一个印章。可以设置印章的位置、大小、外观等属性。另外,还可以将印章图片、文字等内容添加到印章中。最后,将印章添加到PDF文档中并保存即可。
具体的步骤为:
1. 创建一个PDF文档对象
2. 通过库提供的方法创建一个印章对象,设置印章的属性和内容
3. 将印章添加到PDF文档中
4. 保存PDF文档
除了添加静态的印章,有些库还支持在PDF文档中添加动态的电子签名。这种电子签名可以包括数字证书等信息,具有更高的安全性和可信度。
总之,使用Java库给PDF文档加盖印章是一个相对简单的操作,只需要几行代码就可以完成。通过这种方式可以在文档上加入验证信息或者个人签名,增强文档的可信度和安全性。
java实现印章签名
要实现 Java 中的印章签名,可以使用数字证书和印章图片。具体操作步骤如下:
1. 获取数字证书和私钥,并使用私钥对印章图片进行签名。可以使用 Java 中的 KeyStore 类和 PrivateKey 接口来获取证书和私钥。
```
KeyStore keyStore = KeyStore.getInstance("PKCS12");
keyStore.load(new FileInputStream("path/to/certificate.pfx"), "password".toCharArray());
String alias = keyStore.aliases().nextElement();
X509Certificate cert = (X509Certificate) keyStore.getCertificate(alias);
PrivateKey privateKey = (PrivateKey) keyStore.getKey(alias, "password".toCharArray());
BufferedImage stamp = ImageIO.read(new FileInputStream("path/to/stamp.png"));
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initSign(privateKey);
ByteArrayOutputStream stampBytes = new ByteArrayOutputStream();
ImageIO.write(stamp, "png", stampBytes);
byte[] stampData = stampBytes.toByteArray();
signature.update(stampData);
byte[] signedData = signature.sign();
```
2. 将签名后的印章图片和证书一起写入 PDF 文件中。可以使用 iText 库来操作 PDF 文件。
```
PdfReader reader = new PdfReader("path/to/unsigned.pdf");
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream("path/to/signed.pdf"));
PdfSignatureAppearance appearance = stamper.getSignatureAppearance();
appearance.setReason("I am the author");
appearance.setLocation("Beijing");
appearance.setVisibleSignature(new Rectangle(100, 100, 200, 200), 1, "signature");
PdfTemplate template = PdfTemplate.createTemplate(stamper.getWriter(), stamp.getWidth(), stamp.getHeight());
Graphics2D g2d = template.createGraphics(stamp.getWidth(), stamp.getHeight());
g2d.drawImage(stamp, 0, 0, null);
g2d.dispose();
PdfImage image = PdfImage.getImage(template);
appearance.setImage(image);
ExternalSignature pks = new PrivateKeySignature(privateKey, "SHA-256", "BC");
ExternalDigest digest = new BouncyCastleDigest();
MakeSignature.signDetached(appearance, digest, pks, new X509Certificate[]{cert}, null, null, null, 0, MakeSignature.CryptoStandard.CMS);
stamper.close();
reader.close();
```
以上就是 Java 实现印章签名的基本步骤。需要注意的是,本例中使用了 BouncyCastle 库来实现签名算法,需要预先引入该库。