数学专项permutation:UVa 306

来源:互联网 发布:ie11网吧专用优化版 编辑:程序博客网 时间:2024/05/01 14:29

只要找到循环节就行了,然后就是模拟了。

#include <iostream>#include <cstdio>#include <cstring>using namespace std;int n,k;int p[210],vis[210],cnt[210],v[210];char s[210],per[210];int main(){    while(cin>>n&&n)    {        for(int i=0;i<n;i++)        {            cin>>p[i];            p[i]--;        }        memset(vis,0,sizeof(vis));        int c=1;        for(int i=0;i<n;i++) if(!vis[i])        {            int j=i,m=0;            do            {                vis[j]=c;                j=p[j];                m++;            } while(j!=i);            cnt[c++]=m;        }        while(cin>>k&&k)        {            getchar();            cin.getline(s,300);            memset(v,0,sizeof(v));            for(int i=0;i<n;i++) if(!v[i])            {                int tmp=k%cnt[vis[i]];                int j=i;                do                {                    int t=tmp,u=j;                    v[j]=1;                    while(t--) u=p[u];                    if(i<strlen(s)) per[u]=s[i];                    else per[u]=' ';                } while(j!=i);            }            per[n]=0;            cout<<per<<endl;        }        cout<<endl;    }    return 0;}


原创粉丝点击