usaco Calf Flac
来源:互联网 发布:2016网络作家 编辑:程序博客网 时间:2024/06/06 16:25
这题考察最基本的回文串处理,采取的算法是枚举回文串的中心点,不过要分回文串长度是奇数和偶数的情况。
/*ID: ljracm1LANG: C++PROB: calfflac*/#include<cstdio>#include<cstring>#include<ctype.h>#define Tusing namespace std;int main(){ #ifdef T freopen("calfflac.in","r",stdin); freopen("calfflac.out","w",stdout); #endif char ch; char str1[20005],str[20005]; int len1=0,len=0,h[20005]; //h[20005]专门用来记录原字符串中非标点字符的实际位置 while(scanf("%c",&ch)!=EOF){ if((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z')){ h[len1]=len; str[len++]=ch; str1[len1++]=tolower(ch); str[len]='\0'; str1[len]='\0'; } else{ str[len++]=ch; str[len]='\0'; } } int maxn1 = 0, center1 =0;//maxn1记录最长回文串为奇数的情况, center1为中心节点的起点 for(int i=0; i<len1; i++){//枚举中心节点的情况 int l=0;//从起始长度为0算起 while(str1[l+i]==str1[i-l]&&l+i<len1&&i-l>=0)l++; if(maxn1<l){ maxn1 = l; center1 = i; } } int maxn2 = 0, center2 = 0; for(int i=0; i<len1; i++){ int l=0; while(str1[l+1+i]==str1[i-l]&&l+i<len1&&i-l>=0)l++; if(maxn2<l){ maxn2 = l; center2 = i; } } //前面maxn1与maxn2均是一半长的情况,将它变回实际长度进行比较 maxn1 = maxn1*2-1; maxn2 *= 2; int maxn,center; if(maxn1>maxn2){ maxn = maxn1; center = center1; } else{ maxn = maxn2; center = center2; } printf("%d\n",maxn); for(int i=h[center-(maxn+1)/2+1]; i<=h[center-(maxn+1)/2+maxn]; i++) printf("%c",str[i]); printf("\n"); return 0;}
0 0
- Calf Flac(USACO)
- USACO 1.3-Calf Flac
- [USACO] Calf Flac
- usaco Calf Flac
- USACO 1.3 Calf Flac
- USACO 1.3 Calf Flac
- usaco Calf Flac
- USACO:Calf Flac
- USACO Calf Flac
- USACO-Calf Flac
- usaco-Calf Flac
- USACO Calf Flac
- usaco Calf Flac
- Calf Flac-usaco
- [USACO]Section 1.3 Calf Flac
- Usaco 1.3.3 Calf Flac
- USACO Section 1.3 Calf Flac
- [USACO 1.3.3] Calf Flac
- 2171 防守阵地 II
- MFC学习之CTreeCtrl控件的使用
- struts2 <s: select 标签取值
- WCF 过程中的问题一
- 万年历制作
- usaco Calf Flac
- 谷歌面试题:给定头结点和当前结点,删除当前结点
- Cracking The Coding Interview 9.7
- 无废话MVC入门教程四[视图中的Layout使用]
- JVM垃圾回收算法简介
- Codeblocks下配置OpenGL
- Linux 2.6.32.27在Debian 7下编译不过的问题
- 对ACE锁、条件变量、信号量在windows和linux平台下的测试
- 黑马程序员_Java基础[5]_重载、数组