hdoj 4552 怪盗基德的挑战书 【KMP 求所有前缀在原串种出现的次数之和】
来源:互联网 发布:靠谱韩代淘宝 豆瓣 编辑:程序博客网 时间:2024/05/20 02:53
怪盗基德的挑战书
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 952 Accepted Submission(s): 465
Problem Description
“在树最美丽的那天,当时间老人再次把大钟平均分开时,我会降临在灯火之城的金字塔前,带走那最珍贵的笑容。”这是怪盗基德盗取巴黎卢浮宫的《蒙娜丽莎的微笑》这幅画时,挑战书上的内容。
但这次,怪盗基德的挑战书上出现了一串串小写字母“aaab sdfeeddd...”。柯南以小学生的眼睛,超凡高中生的头脑,快速统计各种字母频率,字符串长度,并结合挑战书出现的时间等信息,试图分析怪盗基德的意图。最后,他将线索锁定在字符串的循环次数上。并且进一步推理发现,从字符串的第一位开始,到第i位,形成该字符串的子串(c1, c2, c3 ... ci )。对于某一子串ci在该字符串中出现的次数记为ki,则全部子串的循环次数总和AIM = k1 + k2 + ... + ki + ... + kn,柯南发现,AIM恰好对应一个ASCII码!所以,只要把挑战书上的字符串转变成数字,再找到对应的ASCII码,就可以破解这份挑战书了!
现在,你的任务就是把字符串转变成对应数字,因为ASCII码以及扩展ASCII码全部只有256个,所以,本题只要把结果对256取余即可。
但这次,怪盗基德的挑战书上出现了一串串小写字母“aaab sdfeeddd...”。柯南以小学生的眼睛,超凡高中生的头脑,快速统计各种字母频率,字符串长度,并结合挑战书出现的时间等信息,试图分析怪盗基德的意图。最后,他将线索锁定在字符串的循环次数上。并且进一步推理发现,从字符串的第一位开始,到第i位,形成该字符串的子串(c1, c2, c3 ... ci )。对于某一子串ci在该字符串中出现的次数记为ki,则全部子串的循环次数总和AIM = k1 + k2 + ... + ki + ... + kn,柯南发现,AIM恰好对应一个ASCII码!所以,只要把挑战书上的字符串转变成数字,再找到对应的ASCII码,就可以破解这份挑战书了!
现在,你的任务就是把字符串转变成对应数字,因为ASCII码以及扩展ASCII码全部只有256个,所以,本题只要把结果对256取余即可。
Input
输入有多组测试数据;
每组测试数据只有一个字符串,由各种小写字母组成,中间无空格。
字符串的长度为L(0 < L <= 100000)。
每组测试数据只有一个字符串,由各种小写字母组成,中间无空格。
字符串的长度为L(0 < L <= 100000)。
Output
请计算并输出字符串的AIM值,每组数据输出一行。
Sample Input
aaaabab
Sample Output
66
第一种思路:
MP算法 同hdoj3336
AC代码:
#include <cstdio>#include <cstring>#define LL long long#define MAX 100000+10using namespace std; char P[MAX], T[MAX];int f[MAX];int dp[MAX];//存储前i个字符构成的字符串 在原串中出现的个数 void getfail(){ int i, j; f[0] = f[1] = 0; int len = strlen(P); for(i = 1; i < len; i++) { j = f[i]; while(j && P[i] != P[j]) j = f[j]; f[i+1] = P[i]==P[j]?j+1:0; }}int main(){ int n; int i, j; LL sum; while(scanf("%s", P) != EOF) { getfail(); n = strlen(P); sum = 0; dp[0] = 0; for(i = 1; i <= n; i++) { dp[i] = dp[f[i]] + 1; sum += dp[i]; } printf("%d\n", sum % 256); } return 0;}
第二种思路:每次寻找能与原字符串匹配的最大字符串
神思路。。。
#include <cstdio>#include <cstring>char str[100000+10];int main(){int flag, ans;int k, i, j;while(scanf("%s", str) != EOF){int l = strlen(str);ans = 0; for(i = 0; i < l; i++)//第一个字符 {for(j = 0, k = i; j < l; j++, k++)//寻找能与 原串匹配的最大字符串 {if(str[k] != str[j])//直到不能 匹配 break;}ans += j;//长度为j的字符串 有j个以第一个字符为开头的子串 } printf("%d\n", ans % 256);}return 0;}
0 0
- hdoj 4552 怪盗基德的挑战书 【KMP 求所有前缀在原串种出现的次数之和】
- Hdu 4552 怪盗基德的挑战书 (所有前缀出现次数和 后缀数组或KMP)
- hdoj 3336 Count the string 【kmp求 所有前缀 在原串中出现的次数 总和】
- 所有前缀在串中出现的次数之和 kmp hdu 3336 count the string
- hdu4552怪盗基德的挑战书 --KMP求字符串所有的前缀数
- HDU 3336 KMP 求所有前缀在母串中出现的次数
- hdoj 4552 怪盗基德的挑战书 【KMP】
- hdu 4552 求所有字符串前缀在字符串中出现的总次数
- HDOJ 4552 怪盗基德的挑战书(KMP+DP,不懂)
- hdu4552怪盗基德的挑战书&hdu3336Count the string【后缀数组求各前缀重复次数和】
- 【Kmp求字符串前缀在字符串出现的次数】51nod 1277 字符串中的最大值
- hdoj 1686 Oulipo 【求一个串在另一串的出现次数】【KMP】
- hdu 4552 怪盗基德的挑战书 (kmp+dp)
- 【HDU 4552】怪盗基德的挑战书(kmp)
- 【后缀数组】 HDOJ 4552 怪盗基德的挑战书
- KMP求模式串在原串中出现的次数
- KMP算法求模式串在原串中出现的次数
- hdu 3336Count the string(KMP变形,求前缀出现的次数和)
- Table View Controller注意事项
- A*算法——第二种
- 海量数据相似度计算之simhash短文本查找
- vmware装各种系统
- 6.对学生成绩进行统计计算,参加考试的有6名学生,考试成绩分别为94.5,89.0,79.5,64.5,81.5,73.5,显示考试的总分和平均分,之后显示大于考试平均分的成绩信息。请写出实现上述功能
- hdoj 4552 怪盗基德的挑战书 【KMP 求所有前缀在原串种出现的次数之和】
- Extjs-Grid-动态生成columns
- mysql dump shell 脚本crontab 计划任务
- 2015/7/21/接口/工厂设计模式/封装/抽象
- 项目的导入导出
- php const和define的区别(php类中如何定义常量)
- OJ第六批——Problem A: A代码完善--向量的运算
- OJ 纯虚函数
- 怒刷leetcode题目(2)235,191,141,217,