请问关流时 "\n" 比 ‘\n’ 快一些,在这道题中时间卡得比较极限,将 "\n" 换成 ‘\n’ 就从 AC 变成TLE
AC:
// LUOGU_RID: 169829351
#include<bits/stdc++.h>
using namespace std;
int n,t,f[205][6005],res;
string s;
struct node{
int fir,sec;
}pos[60][2005];
vector<int>v[205][205];
void ans(node p){
if(p.sec==-1){
return ;
}
ans(pos[p.sec][p.fir]);
if(p.sec>25){
cout<<char(p.sec-26+'A');
}
else{
cout<<char(p.sec+'a');
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>t;
for(register int o=1;o<=t;o++){
cin>>n;
for(register int i=1;i<=n;i++){
cin>>s;
for(register int j=0;j<52;j++){
v[i][j].clear();
}
for(register int j=0;j<s.size();j++){
if(s[j]>='A'&&s[j]<='Z'){
v[i][s[j]-'A'+26].push_back(j+1);
}
if(s[j]>='a'&&s[j]<='z'){
v[i][s[j]-'a'].push_back(j+1);
}
}
}
int res=0;
memset(f,0,sizeof f);
queue<node>q;
for(register int i=0;i<52;i++){
for(register int j=0;j<(1<<n);j++){
q.push({j,i});
pos[i][j].fir=-1;
pos[i][j].sec=-1;
}
}
int x=-1,y=-1;
while(!q.empty()){
int a=q.front().fir,b=q.front().sec;
q.pop();
int flag=1;
for(register int i=1;i<=n;i++){
if(((a>>(i-1))&1)>=v[i][b].size()){
flag=0;
}
}
if(!flag){
continue;
}
f[b][a]=max(f[b][a],1);
if(f[b][a]>res){
res=f[b][a];
x=a;
y=b;
}
for(register int i=0;i<52;i++){
int check=1,to=0;
for(register int j=1;j<=n;j++){
int tot=((a>>(j-1))&1);
tot=v[j][b][tot];
int k=0;
while(k<v[j][i].size()&&v[j][i][k]<=tot){
k++;
}
if(k>=v[j][i].size()){
check=0;
break;
}
if(k==1){
to=to|(1<<(j-1));
}
}
if(!check){
continue;
}
if(f[i][to]<f[b][a]+1){
f[i][to]=f[b][a]+1;
pos[i][to]={a,b};
q.push({to,i});
}
}
}
cout<<res<<"\n";
ans({x,y});
cout<<"\n";
}
return 0;
}
TLE:
// LUOGU_RID: 169829351
#include<bits/stdc++.h>
using namespace std;
int n,t,f[205][6005],res;
string s;
struct node{
int fir,sec;
}pos[60][2005];
vector<int>v[205][205];
void ans(node p){
if(p.sec==-1){
return ;
}
ans(pos[p.sec][p.fir]);
if(p.sec>25){
cout<<char(p.sec-26+'A');
}
else{
cout<<char(p.sec+'a');
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>t;
for(register int o=1;o<=t;o++){
cin>>n;
for(register int i=1;i<=n;i++){
cin>>s;
for(register int j=0;j<52;j++){
v[i][j].clear();
}
for(register int j=0;j<s.size();j++){
if(s[j]>='A'&&s[j]<='Z'){
v[i][s[j]-'A'+26].push_back(j+1);
}
if(s[j]>='a'&&s[j]<='z'){
v[i][s[j]-'a'].push_back(j+1);
}
}
}
int res=0;
memset(f,0,sizeof f);
queue<node>q;
for(register int i=0;i<52;i++){
for(register int j=0;j<(1<<n);j++){
q.push({j,i});
pos[i][j].fir=-1;
pos[i][j].sec=-1;
}
}
int x=-1,y=-1;
while(!q.empty()){
int a=q.front().fir,b=q.front().sec;
q.pop();
int flag=1;
for(register int i=1;i<=n;i++){
if(((a>>(i-1))&1)>=v[i][b].size()){
flag=0;
}
}
if(!flag){
continue;
}
f[b][a]=max(f[b][a],1);
if(f[b][a]>res){
res=f[b][a];
x=a;
y=b;
}
for(register int i=0;i<52;i++){
int check=1,to=0;
for(register int j=1;j<=n;j++){
int tot=((a>>(j-1))&1);
tot=v[j][b][tot];
int k=0;
while(k<v[j][i].size()&&v[j][i][k]<=tot){
k++;
}
if(k>=v[j][i].size()){
check=0;
break;
}
if(k==1){
to=to|(1<<(j-1));
}
}
if(!check){
continue;
}
if(f[i][to]<f[b][a]+1){
f[i][to]=f[b][a]+1;
pos[i][to]={a,b};
q.push({to,i});
}
}
}
cout<<res<<'\n';
ans({x,y});
cout<<'\n';
}
return 0;
}
TLE状态:
