首页 > 学院 > 开发设计 > 正文

poj 3007 Organize Your Train part II(map)

2019-11-11 01:26:57
字体:
来源:转载
供稿:网友

题意:

给一个字符串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;}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表