设为首页 加入收藏

TOP

UVA 11888 - Abnormal 89's(Manachar)
2015-07-20 17:51:22 来源: 作者: 【 】 浏览:2
Tags:UVA 11888 Abnormal 89' Manachar

UVA 11888 - Abnormal 89's

题目链接

题意:给定一个字符串,判断类型,一共三种,两个回文拼接成的,一个回文,其它

思路:利用Manachar处理出每个位置的最长回文,然后扫描一遍去判断即可

代码:

#include 
  
   
#include 
   
     #include 
    
      using namespace std; const int N = 200005; int t, p[N * 2], n, len; char str[N], s[N * 2]; void manachar() { len = 2; s[0] = '@'; s[1] = '#'; for (int i = 0; i < n; i++) { s[len++] = str[i]; s[len++] = '#'; } s[len] = '\0'; int mx = 0, id; for (int i = 1; i < len; i++) { if (mx > i) p[i] = min(p[2 * id - i], mx - i); else p[i] = 1; while (s[i + p[i]] == s[i - p[i]]) p[i]++; if (i + p[i] > mx) { id = i; mx = i + p[i]; } } } int judge() { int need = 0; for (int i = 2; i < len - 1; i++) { if ((p[i] - 1) / 2 == need) { int l = i + p[i] - 1; int r = len - 1; int mid = (l + r) / 2; int lneed = need * 2; if (s[i] != '#') lneed++; int rneed = n - lneed; if (rneed && rneed == p[mid] - 1) return 0; } if (s[i] != '#') need++; } if (p[len / 2] - 1 == n) return 1; return 2; } int main() { scanf("%d", &t); while (t--) { scanf("%s", str); n = strlen(str); manachar(); if (judge() == 0) printf("alindrome\n"); else if (judge() == 1) printf("palindrome\n"); else printf("simple\n"); } return 0; }
    
   
  


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇POJ训练计划2253_Frogger(最短路/.. 下一篇const对象,NULL和nullptr,C++中..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·C++ 语言社区-CSDN社 (2025-12-24 17:48:24)
·CSDN问答专区社区-CS (2025-12-24 17:48:22)
·C++中`a = b = c`与` (2025-12-24 17:48:19)
·C语言结构体怎么直接 (2025-12-24 17:19:44)
·为什么指针作为c语言 (2025-12-24 17:19:41)