题目背景
墨家家主召集弟子的原因是因为截获了密电并破获了重大情报,“公主薨,国王失踪,墨家即将面临灭顶之灾”。
题目描述
密电是由大小写字母组成字符串,密电之所以能破译是因为墨家掌握了破解方法,密钥是一个整数t,代表按字母表循环顺位t个字母。
比如:
密电:Abccz
密钥:1
破译结果:Bcdda
但是,敌人其实加密方法早就已经升级了,凡是元音字母均不替换。
比如:
密电:Abccz
密钥:1
破译结果:Acdda
现在定义信息相似度为两个字符串的最大公共子串的长度。 最大公共子串就是,两个字符串的所有子串中能够相互匹配上的最大长度的字串。 比如:“abcdmmm” 和 “ppabcdapabb”, 最大公共子串是"abcd",则相似度为4。
给定密文、密钥求墨家破译信息的相似度为多少。
输入格式
第一行,一个字符串s(由大小写字母构成,s.length≤1000)代表密文;
第二行,一个整数t(0≤t≤1000)。
输出格式
一个整数,代表相似度。
输入输出样例
输入 #1复制
Accepted
3
输出
2
输入
mxrartfwkb
1
输出
6
解题思路:
难在审题要清楚,搞懂题目在讲什么哦!!!
代码如下:
#include <iostream>
#include <cstring>
using namespace std;
string a, b;
const int N = 1010;
int dp[N][N];
int n;int main() {cin >> a;cin >> n;string b = a;int len = a.length();for (int i = 0; i < len; i++) {if (a[i] == 'A' || a[i] == 'E' || a[i] == 'I' || a[i] == 'O' || a[i] == 'U' ||a[i] == 'a' || a[i] == 'e' || a[i] == 'i' || a[i] == 'o' || a[i] == 'u')continue;else {a[i] = a[i] + n % 26;if (a[i] > 'z')//因为小写字母的ASCII码比大写字母的大,所以//我们先判断小写字母a[i] = a[i] - 'z' + 'a' - 1;else if (a[i] > 'Z' && a[i] < 'a')//注意要加小于'a'a[i] = a[i] - 'Z' + 'A' - 1;}}for (int i = 0; i < len; i++) {b[i] = b[i] + n % 26;if (b[i] > 'z')b[i] = b[i] - 'z' + 'a' - 1;else if (a[i] > 'Z' && b[i] < 'a')b[i] = b[i] - 'Z' + 'A' - 1;}int maxs = -1;//求最长公共子串for (int i = 1; i <= len; i++)for (int j = 1; j <= len; j++) {if (a[i - 1] == b[j - 1])dp[i][j] = dp[i - 1][j - 1] + 1;elsedp[i][j] = 0;maxs = max(dp[i][j], maxs);}cout << maxs << endl;return 0;
}