题意:
给一个字符串s,将s在任意一位拆开成两个子串s1, s2,可将子串翻转,然后重新连接一起形成新的字符串,可以让s2在前,问最终能形成多少个不同的字符串。
解题思路:
枚举不同的拆分情况,然后用map,当然,这么耿直肯定是要超时的,但是我加了点优化,水过去了,嘻嘻。map比较慢,这题数据比较大,其实不如直接写查找树。
代码:
#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++) { //将要用到的四种子串提前求出,避免重复操作 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;}
新闻热点
疑难解答