⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1439 cipher.cpp

📁 ACM 威士忌部分答案
💻 CPP
字号:
//ACM暑期集训队练习赛(5)1001 Cipher 
#include<iostream>
#include<string>
#include<memory>
using namespace std;
const int N=201;

int main()
{
	int key[N]; //secret kay
	int keys[N]; //group information
	char ct[N]; //CipherText
	bool used[N];
	int cycle[N][N];
	int n;
	
	while(cin>>n,n>0)
	{
		for(int i=0;i<n;i++)
			cin>>key[i];

		memset(used,0,sizeof(used));
		int x=0;
		int idxc=0;
		while(x<n)
		{
			if(used[x])
			{
				x++;
				continue;
			}
			else
			{
				used[x]=true;
				int mark=x;
				int len=1;
				cycle[idxc][len]=key[x];
				while(key[x]!=mark+1)
				{
					len++;
					x=key[x]-1;
					used[x]=true;
					cycle[idxc][len]=key[x];
				}
				cycle[idxc][0]=len;
				for(int i=1;i<=len;i++)
					keys[cycle[idxc][i]-1]=idxc;
				x=mark;
				idxc++;
			}//if
			x++;
		}//while
	
		int m;
		while(cin>>m,m>0)
		{
			char ch;
			cin.get(ch);
			int idx=0;
			while(cin.get(ch),ch!='\n')
				ct[idx++]=ch;
	
			for(int i=idx;i<n;i++)
				ct[i]=' ';
			char it[N];//intertext;
			memset(used,0,sizeof(used));
			x=0;
			while(x<n)
			{
				if(used[x])
				{
					x++;
					continue;
				}
				int mark=keys[x];
				int step=m%cycle[mark][0];
				int pi=1,pj=pi+step;
				for(int i=0;i<cycle[mark][0];i++)
				{
					used[cycle[mark][pj]-1]=true;
					it[cycle[mark][pj]-1]=ct[cycle[mark][pi]-1];
					pi++;pj++;
					if(pj==cycle[mark][0]+1)
						pj=1;
				}
				x++;
			}//while x
			it[n]='\0';
			cout<<it<<endl;
		}
		cout<<endl;
	}//while
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -