1. 程式人生 > >ACM水題--字串的字首和字尾

ACM水題--字串的字首和字尾

字串的字首和字尾

Time Limit:1000MS  Memory Limit:65536K
Total Submit:81 Accepted:22 

Description 

字串的字首是指字串的任意首部。比如字串“abbc”的字首有“a”,“ab”,“abb”,“abbc”。同樣,字串的任意尾部是字串的字尾,“abbc”的字尾有“c”,“bc”,“bbc”,“abbc”。現在給出一些字串, 找出每個字串中含字元種類最多的字首或字尾。

Input 

輸入第一行是一個整數n(1<=n<=50),表示有n個字串。 
下面有n行,每行的格式是這樣:字串str 字元ch 
字串str由小寫字母組成,長度不超過100000,字元ch只有兩個取值’P’,’S’。 
如果ch為’P’,則找出含字元種類最多的字首。如果ch為’S’,則找出含字元種類最多的字尾。 


Output 

對於每個字串,輸出一行。 
輸出格式是這樣:String #X: Y 
按字串的讀入順序,X從1開始遞增到n。 
Y是滿足條件的字首字串或字尾字串, 
如果有多個字首或字尾滿足條件,則取長度最小的一個。 


Sample Input 


3
abbc P
kaaaaaaaaaa P
nlogn S


Sample Output 


String #1: abbc
String #2: ka
String #3: logn

Source 

cxyue




 
/*	-----------------------------------------------------------------------------------
	大概想法:

	舉例:
	情景:當選擇為P時
	
	思路:1.字串頭尾各設一個指標,將兩個指標所指向的值作比較,直到兩個指標所針的地址相同
		  2.若頭指標所指的字元與尾指標相等,則尾指標向前移一位,頭指標重置為第一位,重複1
		  3.若頭指標所指的字元與尾指標不相等,則頭指標向前移一位,重複1
		  

	結果: Accept,時間15MS.......太弱了.......不過,自己還是沒有想到可以更快的方法.
	-----------------------------------------------------------------------------------	*/



#include<stdio.h>
#include<string.h>

void Find(char *szStr, int n, char choice) ;

char szInputStr[100000] ;	

int main(void)
{
	int i = 1 ; 
	int t = 0 ;

	char chChoice = 0 ;
	
	scanf("%d",&t) ;
	
	while(getchar() != '\n')
	{
		continue ;
	}

	while(t-- > 0) 
	{
		scanf("%s %c",szInputStr,&chChoice) ;		
		Find(szInputStr,i++,chChoice) ;		
	}
		
	return 0 ;
}


void Find(char *szStr , int n, char choice)
{
	char *pszBeg = szStr ;
	char *pszEnd = szStr + strlen(szStr) - 1 ;
	char szOutputStr[1000] ;

	char *pEndPos = pszEnd ; 
	char *pBegPos = pszBeg ;

	int iLen = strlen(szStr) ;
	
	if('P' == choice)
	{
		while(pszBeg != pszEnd)
		{	
			if(*pszBeg == *pszEnd)
			{
				pszEnd-- ;	
				pEndPos = pszEnd ;
				pszBeg = szStr ;
			}
			else
			{
				pszBeg++ ;
			}
		}
		
		iLen = pEndPos - szStr + 1 ;
		strncpy(szOutputStr, szStr, iLen) ;	
		szOutputStr[iLen] = '\0' ;
	}
	else if('S' == choice)
	{
		while(pszBeg != pszEnd)
		{	
			if(*pszBeg == *pszEnd)
			{
				pszBeg++ ;	
				pBegPos = pszBeg ;
				pszEnd = szStr + iLen - 1 ;
			}
			else
			{
				pszEnd-- ;
			}
		}
		
		pszEnd = szStr + iLen - 1 ;
		iLen = pszEnd - pBegPos + 1  ;
		strncpy(szOutputStr, pBegPos, iLen) ;	
		szOutputStr[iLen] = '\0' ;
	}

	printf("String #%d: %s\n",n,szOutputStr) ;
}