Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

Re:那位大哥哥,帮帮忙.reverse()多好用,要学会投机取巧

Posted by ACM06019 at 2006-10-16 16:08:12 on Problem 3007
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:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator