UVA

来源:互联网 发布:r18asmr软件 编辑:程序博客网 时间:2024/04/28 01:47
题目大意,给你一个字符串,求他的子串中有多少是回文的子串。方法,要用二维数组来做。如果用一维数组,则会超时#include <stdio.h>#include <stdlib.h>#include <string.h>#include <limits.h>#include <malloc.h>#include <ctype.h>#include <math.h>#include <string>#include <iostream>#include <algorithm>using namespace std;#include <stack>#include <queue>#include <vector>#include <deque>#include <set>#include <map>int main(){int t,cas,i,j,k;char a[1002];int data[1002][27];while(~scanf("%d",&t)){getchar();for(cas=1;cas<=t;cas++){memset(data,0,sizeof(data));gets(a);int len=strlen(a);data[0][a[0]-'a']++;for(i=1;i<len;i++){data[i][a[i]-'a'] = data[i-1][a[i]-'a']+1;for(j=0;j<26;j++){if(a[i]-'a' != j){data[i][j] = data[i-1][j];}}}记录在当前位置,每个字母出现的次数。int flag=0;int sum=0;for(i=0;i<len;i++){for(j=i+1;j<len;j++){for(k=0;k<26;k++)因为前面已经计算过了。所以在这里只要调用就可以了{if(i == 0){if(data[j][k]&1){flag++;if(flag == 2){break;}}}else{if((data[j][k]-data[i-1][k])&1){flag++;if(flag==2)break;}}}if(flag != 2)sum++;flag = 0;}}printf("Case %d: %d\n",cas,sum+len);}}return 0;}

0 0