题意很简单,就是问给出的n个单词的句子经过全排列顺序能否和下面m句句子中某句所相同的单词顺序相同
如果会string类 容器还有algorithm中next_permutation就很简单了
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <queue>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
const int INF=1000000;
int getInt(){
char ch=getchar();
while(ch<'0'||ch>'9')ch=getchar();
int num=0;
while(ch>='0'&&ch<='9'){
num=num*10+ch-'0';
ch=getchar();
}
return num;
}
int n,m;
string s[5];
vector <string> str[33];
int a[5];
int judge(int i)
{
int j=0,len=0;
while(len<str[i].size()&&j<n)
{
if(str[i][len]==s[a[j]])
j++;
len++;
}
if(j==n)
return true;
return false;
}
int zidian()
{
int sum=0;
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
if(a[i]>a[j])
sum++;
}
}
return sum;
}
int main()
{
int i,j,ans,res,pos,vis,v;
cin>>n;
for(i=0;i<n;i++)
cin>>s[i];
cin>>m;
for(i=0;i<m;i++)
{
cin>>ans;
str[i].resize(ans);
for(j=0;j<ans;j++)
cin>>str[i][j];
}
int flag=0;
pos=INF;
for(i=0;i<m;i++)
{
res=INF;
for(j=0;j<n;j++)
a[j]=j;
do{
if( judge(i) )
res=min(res,zidian());
}while(next_permutation(a,a+n));
if(res<pos)
{
pos=res;
vis=i;
flag=1;
}
}
if(!flag)
cout<<"Brand new problem!\n";
else
{
cout<<vis+1<<endl;
int p=n*(n-1)/2-pos+1;
cout<<"[:";
for(i=0;i<p;i++)
cout<<"|";
cout<<":]\n";
}
return 0;
}