input | output |
---|---|
tebidohtebidoh |
tebidoh |
本题就看故事, 故事看起来一长串, 理解起来也挺费力,所以一开始我使用KMP算法查找了所有子串:
#include <string> #include <vector> #include <cmath> #include <algorithm> #include <iostream> #include <map> using namespace std; class SandroBook { vector<int> tbl; int encounter; string spell; public: SandroBook():tbl(), encounter(0) { } int kmpSearch(string txt, string pat, int sta=0) { tbl.resize(pat.size()); genTbl(pat); int c = 0; for (int i = 0, j = 0; i < txt.size(); i++) { if (pat[j] == txt[i]) j++; else if (j > 0) { j = tbl[j-1]; i--; } if (pat.size() == j) { c++; j = tbl[j-1]; } } return c; } void genTbl(const string &pat) { for (int i = 1, j = 0; i < pat.size(); i++) { if (pat[i] == pat[j]) tbl[i] = ++j; else if (j > 0) { j = tbl[j-1]; i--; } } } void SandroRun() { string txt; cin>>txt; encounter = 0; for (int i = 0; i < txt.size(); i++) { for (int d = i+1; d < txt.size(); d++) { string pat = txt.substr(i, d-i+1); int c = kmpSearch(txt, pat, i+1) + 1; if (c > encounter) { encounter = c; spell = pat; } } } cout<<spell; } };
但是后来一想,这个不对啊,子串包括了一个字母的子串,那么本题就太简单了,看起来甚至像是一个玩笑了。
经验证的确如此,因为下面程序也能通过。教训还是题意的问题,如果可以问,一定要先问清楚题意。大概本题出题者就是在开玩笑。
#include <iostream> #include <stdio.h> using namespace std; int mainSandro() { char str[50]; int maxi,max,i=0; int ch[26]={0}; scanf("%s",&str); while(str[i++]) ch[str[i]-‘a‘]++; maxi=0; max=ch[maxi]; for(i=1;i<26;i++) { if(ch[i]>max) { maxi=i; max=ch[maxi]; } } printf("%c\n",maxi+‘a‘); return 0; }
Timus 1723. Sandro's Book 题解,布布扣,bubuko.com
原文:http://blog.csdn.net/kenden23/article/details/24491141