題意:
給一個(gè)字符串s,將s在任意一位拆開成兩個(gè)子串s1, s2,可將子串翻轉(zhuǎn),然后重新連接一起形成新的字符串,可以讓s2在前,問最終能形成多少個(gè)不同的字符串。
解題思路:
枚舉不同的拆分情況,然后用map,當(dāng)然,這么耿直肯定是要超時(shí)的,但是我加了點(diǎn)優(yōu)化,水過去了,嘻嘻。map比較慢,這題數(shù)據(jù)比較大,其實(shí)不如直接寫查找樹。
代碼:
#include <iostream>#include <cstdio>#include <map>#include <cstring>using namespace std;char b[88];char *rev(char a[]){ int i; int len=strlen(a); for(i=0; i<len; i++) { b[len-1-i]=a[i]; } b[len]='/0'; return b;}int main(){ int n; scanf("%d", &n); int i, j; char ntra[88], forme[88], late[88], x[88], y[88], rforme[88], rlate[88]; string str; int ans=0; char tra[88]; while(n--) { map<string, bool>vis; ans=0; scanf("%s", tra); int len=strlen(tra); for(i=1; i<=len-1; i++) { //將要用到的四種子串提前求出,避免重復(fù)操作 for(j=0; j<i; j++)forme[j]=tra[j];forme[j]='/0'; for(; j<len; j++)late[j-i]=tra[j];late[j-i]='/0'; strcpy(rforme,rev(forme)); strcpy(rlate,rev(late)); //0 0 strcpy(x, forme); strcpy(y, late);// PRintf("%s %s/n", x, y); strcat(x, y); str=x;// cout<<str<<endl; if(!vis[str]){ans++;vis[str]=true;} strcpy(x, forme); strcpy(y, late); strcat(y, x); str=y;// cout<<str<<endl; if(!vis[str]){ans++;vis[str]=true;} //0 1 strcpy(x, forme); strcpy(y, rlate); strcat(x, y); str=x;// cout<<str<<endl; if(!vis[str]){ans++; vis[str]=true;} strcpy(x, forme); strcpy(y, rlate); strcat(y, x); str=y;// cout<<str<<endl; if(!vis[str]){ans++; vis[str]=true;} //1 0 strcpy(x, rforme); strcpy(y, late); strcat(x, y); str=x;// cout<<str<<endl; if(!vis[str]){ans++; vis[str]=true;} strcpy(x, rforme); strcpy(y, late); strcat(y, x); str=y;// cout<<str<<endl; if(!vis[str]){ans++; vis[str]=true;} //1 1 strcpy(x, (rforme)); strcpy(y, (rlate)); strcat(x, y); str=x;// cout<<str<<endl; if(!vis[str]){ans++; vis[str]=true;} strcpy(x, (rforme)); strcpy(y, (rlate)); strcat(y, x); str=y;// cout<<str<<endl; if(!vis[str]){ans++; vis[str]=true;}// cout<<endl; } printf("%d/n", ans); } return 0;}
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注