http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1328
1328: 近似回文词
Time Limit: 1 Sec Memory Limit: 128 MBDescription
输入一行文本,输出最长近似回文词连续子串。所谓近似回文词是指满足以下条件的字符串:
1. S以字母开头,字母结尾
2. a(S)和b(S)最多有2k个位置不同,其中a(S)是S删除所有非字母字符并且把所有字母转化成小写之后得到的串,b(S)是a(S)的逆序串。
比如当k=1时,Race cat是一个近似回文词,因为a(S)=racecat和b(S)=tacecar只有2个位置不同。
Input
输入包含不超过25组数据,每组数据包含两行。第一行是整数k(0<=k<=200),第二行为字符串S,包含至少一个字母但不超过1000个字符(换行符不算)。S只包含字符、空格和其他可打印字符(比如逗号,句号),并且不会以空白字符开头。
Output
对于每组测试数据,输出最长近似回文子串的长度和起始位置(S的第一个字符是位置1)。如果有多个最长近似回文子串解,起始位置应尽量小。
Sample Input
1 Wow, it is a Race cat! 0 abcdefg 0 Kitty: Madam, I'm adam.
Sample Output
Case 1: 8 3 Case 2: 1 1 Case 3: 15 8
HINT
Source
分析:
暴力模拟(有人说会有TLE,但是我就AC啦,RP吧)即可, 还可以从某个点往两边分别比较。
AC代码:
1 #include <stdio.h> 2 #include <algorithm> 3 #include <iostream> 4 #include <string.h> 5 #include <string> 6 #include <math.h> 7 #include <stdlib.h> 8 #include <queue> 9 #include <stack> 10 #include <set> 11 #include <map> 12 #include <list> 13 #include <iomanip> 14 #include <vector> 15 #pragma comment(linker, "/STACK:1024000000,1024000000") 16 #pragma warning(disable:4786) 17 18 using namespace std; 19 20 const int INF = 0x3f3f3f3f; 21 const int MAX = 2000 + 10; 22 const double eps = 1e-8; 23 const double PI = acos(-1.0); 24 25 char str[MAX] , hw[MAX]; 26 int chang[MAX]; 27 int k; 28 29 int main() 30 { 31 int cas = 1; 32 while(~scanf("%d",&k)) 33 { 34 getchar(); 35 gets(str); 36 int len = strlen(str); 37 int cnt = 0; 38 for(int i = 0 ;i < len;i ++) 39 { 40 if((str[i] >= 'A' && str[i] <= 'Z') || (str[i] >= 'a' && str[i] <= 'z')) 41 { 42 char c = str[i]; 43 if(c >= 'A' && c <= 'Z') 44 c = c - 'A' + 'a'; 45 chang[cnt] = i; 46 hw[cnt ++] = c; 47 } 48 } 49 hw[cnt] = '