| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:那位大哥哥,帮帮忙.reverse()多好用,要学会投机取巧In Reply To:那位大哥哥,帮帮忙.(程序含有大量注释) 我也是硬搞的.不过WA. Posted by:Morpheus at 2006-10-09 10:45:04 > #include<stdio.h>
> #include<string.h>
>
>
> char str[73]; //存储输入字符串
> char temp[73];
> char rlt[10000][73];//存储字符串变形后的各种结果
> int k; //存储结果
> int len; //存储输入字符串的长度.
>
> //反转字符串函数
> void rev(char s[],int size)
> {
> int i;
> char ch;
> for(i = 0;i<size/2;i++)
> {
> ch = s[i];
> s[i] = s[size - i - 1];
> s[size - i - 1] = ch;
> }
> }
>
> //处理len - 1情况和len-1 : 1的情况
> void dowithFL()
> {
> /*----------------------------1:len - 1情况-------------------------------*/
> //不作处理
> strcpy(rlt[k++],str);
>
> //两部分对换
> strncpy(rlt[k],&str[1],len - 1);
> rlt[k++][len - 1] = str[0];
> //puts(rlt[k-1]);
>
> //反转第二部分
> rev(&temp[1],len - 1);
> strcpy(rlt[k++],temp);
> //puts(rlt[k-1]);
>
> //反转第二部分并对换
> strcpy(rlt[k],&temp[1]);
> rlt[k++][len -1] = temp[0];
> // puts(rlt[k-1]);
> /*--------------------------len-1 : 1-----------------------------------*/
> strcpy(temp,str);
> //两部分对换
> strncpy(&rlt[k][1],str,len - 1);
> rlt[k++][0] = str[len - 1];
> //puts(rlt[k-1]);
>
> //反转第一部分
> rev(temp,len - 1);
> strcpy(rlt[k++],temp);
> //puts(rlt[k-1]);
>
> //反转第一部分并对换
> strncpy(&rlt[k][1],temp,len - 1);
> rlt[k++][0] = temp[len - 1];
> //puts(rlt[k-1]);
> /*for(i = 0;i<7;i++)
> {
> puts(rlt[i]);
> }
> */
> }
>
> //处理2--len - 1的各种变形情况
> void proce()
> {
> int i;
> for(i = 2;i<len - 1;i++)
> {
> //两部分对换
> strcpy(temp,str);
> strncpy(rlt[k],&temp[i],len - i);
> strncpy(&rlt[k++][len - i],&temp[0],i);
> //puts(rlt[k-1]);
>
> //反转第一部分
> strcpy(temp,str);
> rev(temp,i);
> strcpy(rlt[k++],temp);
> //puts(rlt[k-1]);
>
> //反转第一部分并对换
> strcpy(rlt[k],&temp[len - i]);
> strncpy(&rlt[k++][i],&temp[0],len - i);
> //puts(rlt[k-1]);
>
> //反转第二部分
> strcpy(temp,str);
> rev(&temp[i],len - i);
> strcpy(rlt[k++],temp);
> //puts(rlt[k-1]);
>
> //反转第二部分并对换
> strcpy(rlt[k],&temp[i]);
> strncpy(&rlt[k++][len - i],&temp[0],i);
> //puts(rlt[k-1]);
>
> //两部分都反转
> strcpy(temp,str);
> rev(temp,i);
> //puts(temp);
> rev(&temp[i],len - i);
> //puts(temp);
> strcpy(rlt[k++],temp);
>
> //两部分反转并对换
> strncpy(rlt[k],&temp[i],len - i);
> strncpy(&rlt[k++][len - i],&temp[0],i);
> //puts(rlt[k-1]);
> }
> }
>
> void Print()
> {
> int i,j;
> //查找表中相同的字符串.
> for(i = 0;rlt[i][0] != 0;i++)
> {
> if(rlt[i][0] == -1)
> continue;
> for(j = i+1;rlt[j][0] != 0;j++)
> {
> if(rlt[j][0] == -1)
> continue;
> if((strcmp(rlt[i],rlt[j]) == 0)&&(rlt[j][0] != -1))
> {
> k--;
> rlt[j][0] = -1;
> }
> }
> }
> printf("%d\n",k);//打印结果
> }
>
> int main()
> {
>
> int i = 1;
> int m = 0;
> long n;
>
>
> scanf("%ld",&n);
> getchar();
> while(n--)
> {
> k = 0;
> memset(rlt,0,sizeof(rlt));
> memset(temp,0,sizeof(temp));
>
> gets(str);
> len = strlen(str);
> strcpy(temp,str);
>
> //单独处理只有两个字符的情况
> if(len == 2)
> {
> if(str[0] == str[1])
> {
> printf("1\n");
> continue;
> }
> else
> {
> printf("2\n");
> continue;
> }
> }
>
> //处理len - 1情况和len-1 : 1的情况
> dowithFL();
>
> //处理2--len - 1的各种变形情况
> proce();
>
> Print();
> }
> return 0;
> }
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator