USACO Section 1.3: Prob Calf Flac

这题困扰我的第一个问题是如何将空格也收入string中,查了下string里有个getline的函数,fstream里有个eof()函数可以判断是不是文件EOF了。

碰到的第二个问题是第二个样例,他有很多行,输出里是要把换行也给输出的,而我原来的代码段没有考虑这个因素,我的想法是用一个set<int>来记录原来的string里换行的位置,而我记录下来的word这个string里是没有换行的,这样就避免了用多个string来记录输入。

至于其他比如判断palindrome leetcode里有做过,所以就不赘述了。

具体代码如下

 1 /*

 2 ID: yingzho1

 3 LANG: C++

 4 TASK: calfflac

 5 */

 6 #include <iostream>

 7 #include <fstream>

 8 #include <string>

 9 #include <map>

10 #include <vector>

11 #include <set>

12 #include <algorithm>

13 

14 using namespace std;

15 

16 bool cmp(const int a, const int b) {

17     return a > b;

18 }

19 

20 int main() {

21     ofstream fout ("calfflac.out");

22     ifstream fin ("calfflac.in");

23 

24     string word;

25     set<int> newline;

26     while (!fin.eof()) {

27         string frag;

28         getline(fin, frag);

29         if (!word.size()) word = frag;

30         else word = word + frag;

31         newline.insert(word.length());

32     }

33     //fout << word << endl;

34     vector<int> pos;

35     string newword;

36     for (int i = 0; i < word.size(); i++) {

37         if (isalpha(word[i])) {

38             newword += tolower(word[i]);

39             pos.push_back(i);

40         }

41     }

42     int length = 0;

43     int index;

44     for (int i = 0; i < newword.size(); i++) {

45         int edge = 1;

46         while (i-edge >= 0 && i+edge < newword.size() && newword[i-edge] == newword[i+edge]) edge++;

47         edge--;

48         if (1+edge*2 > length) {

49             length = 1 + edge * 2;

50             index = i - edge;

51         }

52         edge = 0;

53         while (i-edge >= 0 && i+1+edge < newword.size() && newword[i-edge] == newword[i+1+edge]) edge++;

54         if (2*edge > length) {

55             length = 2*edge;

56             index = i-edge+1;

57         }

58         //fout << length << endl;

59     }

60     fout << length << endl;

61     string res;

62     int count = 0;

63     for (int i = pos[index]; i < word.size(); i++) {

64         if (i != pos[index] && newline.count(i)) {

65             fout << res << endl;

66             res = "";

67         }

68         if (isalpha(word[i])) count++;

69         res += word[i];

70         if (count == length) break;

71     }

72     if (res.size()) fout << res << endl;

73 

74     return 0;

75 }

 

你可能感兴趣的:(USACO)