CSU 1328 近似回文词(2013湖南省程序设计竞赛A题)

题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1328

解题报告:中文题题意就不说了。还好数据不大,只有1000,枚举回文串的中心位置,然后向两边扩展,当扩展到 k 大于要求的K的时候停止扩展,不断更新最长的长度跟开始位置最小。我先做了个预处理,先求出了a(S),然后用一个数组保存了a(S)中的字符在原来的字符串中对应的位置在哪,这样便于字符串比较,而且又可以在O(1)时间得到在原来串中的长度跟开始的位置。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 using namespace std;
 6 const int maxn = 1005;
 7 char tt[maxn],str[maxn];
 8 int loc[maxn],K;
 9
10 char chto(char c)
11 {
12     return c >= ‘A‘ && c <= ‘Z‘? (c+‘a‘-‘A‘):c;
13 }
14 void StrCmp(char* str,int i,int j,int& left,int& right)
15 {
16     int k = 0,len = strlen(str);
17     while(i >= 0 && j < len)
18     {
19         if(str[i] != str[j]) k++;
20         if(k > K)
21         break;
22         i--,j++;
23     }
24     left = i+1;
25     right = j - 1;
26 }
27 int kuoleft(int l)
28 {
29     l--;
30     while(l >= 0 && !((tt[l] >= ‘A‘ && tt[l] <= ‘Z‘) || (tt[l] >= ‘a‘ && tt[l] <= ‘z‘)))
31     l--;
32     return l+1;
33 }
34 int kuoright(int r)
35 {
36     r++;
37     int len = strlen(tt);
38     while(r < len && !((tt[r] >= ‘A‘ && tt[r] <= ‘Z‘) || (tt[r] >= ‘a‘ && tt[r] <= ‘z‘)))
39     r++;
40     return r - 1;
41 }
42 int main()
43 {
44     int kase = 1;
45     while(scanf("%d",&K)!=EOF)
46     {
47         getchar();
48         gets(tt);
49         int f = strlen(tt),len = 0;
50         for(int i = 0;i < f;++i)
51         if((tt[i] >= ‘A‘ && tt[i] <= ‘Z‘) || (tt[i] >= ‘a‘ && tt[i] <= ‘z‘))
52         {
53             str[len] = chto(tt[i]);
54             loc[len] = i;
55             len++;    //记录这个字符在原来的子串中对应的位置
56         }
57         str[len] = NULL;
58         int s = 0,L = 0;
59         for(int l = 0;l < len;++l)
60         {
61             int left = 0,right = 0;
62             StrCmp(str,l-1,l+1,left,right);
63             int ll = loc[left],rr = loc[right];
64             int lt = rr - ll + 1;
65             if(lt > L) L = lt,s = ll;
66             else if(lt == L && ll < s) s = ll;
67             if(l < len -1)
68             {
69                 left = right = 0;
70                 StrCmp(str,l,l+1,left,right);
71                 ll = loc[left],rr = loc[right];
72                 lt = rr - ll + 1;
73                 if(lt > L) L = lt,s = ll;
74                 else if(lt == L && ll < s) s = ll;
75             }
76         }
77         printf("Case %d: %d %d\n",kase++,L,s+1);
78     }
79     return 0;
80 }

时间: 2024-12-29 03:59:56

CSU 1328 近似回文词(2013湖南省程序设计竞赛A题)的相关文章

csu 1328: 近似回文词

1328: 近似回文词 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 394  Solved: 144 [Submit][Status][Web Board] Description 输入一行文本,输出最长近似回文词连续子串.所谓近似回文词是指满足以下条件的字符串: 1. S以字母开头,字母结尾 2. a(S)和b(S)最多有2k个位置不同,其中a(S)是S删除所有非字母字符并且把所有字母转化成小写之后得到的串,b(S)是a(S)的逆序串. 比如

CSU 1337 搞笑版费马大定理(2013湖南省程序设计竞赛J题)

题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1337 解题报告:虽然x和y的范围都是10^8,但是如果a 是大于1000的话,那么a^3就会大于10^9,这样等号的右边只有一个10 * c + 3,这个最大只能达到10^9数量级,所以,不管输入的x跟y是多少,我们只要取其中的在1到1000的区间就可以了,枚举a和b,那么c就可以得到,然后判断c的范围是不是在x到y之间,这样时间复杂度就降到了10^6. 1 #include<cstd

csuoj 1328: 近似回文词

http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1328 1328: 近似回文词 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 355  Solved: 138 [Submit][Status][Web Board] Description 输入一行文本,输出最长近似回文词连续子串.所谓近似回文词是指满足以下条件的字符串: 1. S以字母开头,字母结尾 2. a(S)和b(S)最多有2k个位置不同

csu-1328 近似回文词 和 最长回文字符串

原博文地址:http://blog.csdn.net/u012773338/article/details/39857997 最长回文子串 描述:输入一个字符串,求出其中最长的回文子串.子串的含义是:在原串连续出现的字符 串片段.回文的含义是:正着看和倒着看是相同的,如abba和abbebba.在判断是要求忽略所有的标点和空格,且忽略大小写,但输出时按原样输出(首 尾不要输出多余的字符串).输入字符串长度大于等于1小于等于5000,且单独占一行(如果有多组答案,输出第一组). 输入 :每行有一个

字符串 - 近似回文词 --- csu 1328

近似回文词 Problem's Link:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1328 Mean: 略. analyse: 直接暴力枚举每一个终点,然后枚举回文串的半径即可. Time complexity:O(n*m) Source code: // Memory Time // 1347K 0MS // by : Snarl_jsb // 2014-10-03-14.25 #include<algorithm> #include

2012年湖南省程序设计竞赛E题 最短的名字

题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1115 解题报告:输入n个字符串,让你求出可以用来区别这些字符串的最少的前缀总共有多少个字母.可以区别是指每个字符串都取一个自己的前缀,同时保证所有取的这些前缀没有完全相同. 这题用字典树可以做,就是输入的时候把所有的字符串都插入到字典树中,最后把所有被走过不止一次的节点的值都加起来,每个节点的值表示这个节点被走过多少次,然后如果碰到这个节点的值是1的时候总和加1,同时要退出,后面的就不

CSU 1503 点到圆弧的距离(2014湖南省程序设计竞赛A题)

题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1503 解题报告:分两种情况就可以了,第一种是那个点跟圆心的连线在那段扇形的圆弧范围内,这样的话点到圆弧的最短距离就是点到圆心的距离减去半径然后再取绝对值就可以了,第二种情况是那个点跟圆心的连线不在那段扇形的圆弧范围内,这样的话,最短的距离就是到这段圆弧的端点的最小值. 接下来的第一步就是求圆心的坐标跟圆的半径,只要求出圆心坐标半径就好说了,求圆心坐标我用的方法是: 设圆心坐标是(a,b

Vijos1327回文词

回文词 回文词是一种对称的字符串--也就是说,一个回文词,从左到右读和从右到左读得到的 结果是一样的.任意给定一个字符串,通过插入若干字符,都可以变成一个回文词.你的任务是写 一个程序,求出将给定字符串变成回文词所需插入的最少字符数. 比如字符串"Ab3bd",在插入两个字符后可以变成一个回文词("dAb3bAd"或"Adb3bdA"). 然而,插入两个以下的字符无法使它变成一个回文词. 输入格式: 文件的第一行包含一个整数N,表示给定的字符串的

UVA 401 Palindromes(回文词)

 回文词 Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Practice UVA 401 Appoint description:  acmparand  (2013-07-07)Luke  (2014-01-20) System Crawler  (2015-05-10) Description A regular palindrome is a string of