国王的魔镜
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
1
-
描述
-
国王有一个魔镜,可以把任何接触镜面的东西变成原来的两倍——只是,因为是镜子嘛,增加的那部分是反的。
比如一条项链,我们用AB来表示,不同的字母表示不同颜色的珍珠。如果把B端接触镜面的话,魔镜会把这条项链变为ABBA。如果再用一端接触的话,则会变成ABBAABBA(假定国王只用项链的某一端接触魔镜)。
给定最终的项链,请编写程序输出国王没使用魔镜之前,最初的项链可能的最小长度。
-
输入
-
第一行是一个整数N(N<=10)表示测试数据的组数)
每组测试数据占一行 只有一个字符串(长度小于100),由大写英文字母组成,表示最终的项链。
输出
- 每组测试数据的输出只有一个整数,表示国王没使用魔镜前,最初的项链可能的最小长度。 样例输入
-
2 ABBAABBA A
样例输出
-
2 1
知识点:1. strncmp()函数的用法,可以比较两个不同长度的前n个字符 与 strcmp()函数的用法差不多;
2.在字符数组中strcmp()的比较是以'\0'为结束的,所以在下面代码中字符串分割后,在母串要舍去的地方变为'\0' 即可
3. 使用do{}while(条件)可以不用在外面初始化条件,他会先执行一遍,再去判断
4.当字符数组是单个单个复制到另一个字符数组的时候,最后不要忘记加上结束符'\0',不然在用字符串处理函数的时候会出错
/************************************************************************* > File Name: /chik.cpp > Author: SSW > Mail: alisin520@gmail.com > Created Time: Thu 31 Jul 2014 09:45:28 CST ************************************************************************/ #include<iostream> #include<stdio.h> #include<string.h> using namespace std; /* int main() { int n, m, K; scanf("%d", &K); while(K--){ scanf("%d %d", &n, &m); if(2*n > m || m%2) printf("No answer\n"); else printf("%d %d\n",(4*n-m)/2 ,(m-2*n)/2); } return 0; } */ /* void fun(int n, char str[]) { if(0 != n%2){ cout<<n<<endl; return ; } char str1[102], str2[102]; int t = n/2; for(int i = 0; i < n/2; i++) str1[i] = str[i]; for(int i = n-1; i >= t; i--) str2[n-1-i] = str[i]; if(0 == strncmp(str1, str2, t)) fun(t, str1); else{ cout<<n<<endl; return ; } } int main() { char str[102]; int N; cin>>N; while(N--){ cin>>str; int lenght = strlen(str); fun(lenght, str); } return 0; } */ int main(){ int K, q, n; char str[102], tt[102]; scanf("%d", &K); getchar(); while(K--){ cin>>str; q = 0; while(0 == q){ n = strlen(str); if(n%2) break; for(int i = 0; i < n/2; i++) tt[i] = str[n-1-i]; tt[n/2] = '\0'; str[n/2] = '\0'; q = strcmp(tt, str); } printf("%d\n", n); } return 0; }
-
第一行是一个整数N(N<=10)表示测试数据的组数)