Palinwords (处理回文串)

题目链接:https://vjudge.net/contest/344930#problem/G

 

题目大意:给你字符串,如果他包含至少两个长度大于等于3的回文,并且这些回文不能嵌套(例如aaa嵌套在aaaa,waw嵌套在awawa),如果这个字符串这么牛逼的话,就输出他。

 

题目思路:其实这道题有一个贪心的思想在里面,其实每次我们只需要去找长度为3和长度为4的回文串就好了。这里的处理策略就是先处理长度为3的回文串,再处理长度为4的回文串。处理长度为4的回文串的时候,要避免它的子串也是一个回文串。

 

 1 #include <stdio.h>
 2 #include <algorithm>
 3 #include <iostream>
 4 #include <stdlib.h>
 5 #include <string>
 6 #include <string.h>
 7 #include <math.h>
 8 #include <vector>
 9 #include <queue>
10 #include <stack>
11 #include <map>
12 #include <set>
13 
14 
15 #define INF 0x3f3f3f3f
16 #define LL long long
17 
18 typedef unsigned long long ull;
19 const int maxn = 1e5+10;
20 
21 char s[maxn];
22 ull base = 131;
23 ull mod = 1e9+7;
24 ull p[maxn];
25 ull h1[maxn],h2[maxn];
26 ull q[maxn];
27 
28 
29 ull get_hash(ull h[],int l,int r){
30     return (h[r] - h[l-1]*p[r-l+1]);
31 }
32 
33 bool check(char s[]) {
34     std::set<ull> st;
35     int ans = 0;
36     int len = strlen(s+1);
37     for (int i=2;i+1<=len;i++) {
38         if (s[i-1] == s[i+1]) {
39             ull temp = get_hash(h1,i-1,i+1);
40             if (st.find(temp) == st.end()) {
41                 st.insert(temp);
42                 ans++;
43             }
44         }
45     }
46 
47     for (int i=1;i+3<=len;i++) {
48         if (s[i] == s[i+3] && s[i+1] == s[i+2]) {
49             ull a = get_hash(h1,i,i+3);
50             ull b = get_hash(h1,i+1,i+3);
51             ull c = get_hash(h1,i,i+2);
52             if (st.find(a) == st.end() && st.find(b) == st.end() && st.find(c) == st.end()) {
53                 ans++;
54                 st.insert(a);
55                 st.insert(b);
56                 st.insert(c);
57             }
58         }
59     }
60     return ans >= 2;
61 }
62 
63 int main() {
64     p[0] = 1;
65     for (int i=1;i<maxn;i++) {
66         p[i] = p[i-1] * base;
67     }
68     while (~scanf("%s",s+1)) {
69         int len = strlen(s+1);
70         for (int i=1;i<=len;i++) {
71             h1[i] = h1[i-1] * base + s[i];
72         }
73         if (check(s)) {
74             printf("%s\n",s+1);
75         }
76     }
77     return 0;
78 }

 

posted @ 2019-11-29 00:20  _Ackerman  阅读(308)  评论(0编辑  收藏  举报