답안 #223327

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
223327 2020-04-15T07:19:12 Z jamielim Trener (COCI20_trener) C++14
22 / 110
10 ms 2988 KB
/*#include <bits/stdc++.h>
using namespace std;
 
typedef long long ll;
const ll MOD=1000000007;
 
int main(){
	int n,k;
	scanf("%d%d",&n,&k);
	char str[n][k][55];
	for(int i=0;i<n;i++){
		for(int j=0;j<k;j++){
			scanf("%s",str[i][j]);
		}
	}
	ll dp[n][k]; memset(dp,0,sizeof(dp));
	for(int i=0;i<k;i++)dp[n-1][i]=1;
	for(int i=n-2;i>=0;i--){
		for(int j=0;j<k;j++){
			for(int m=0;m<k;m++){
				bool f=1,s=1;
				for(int l=0;l<=i;l++){
					if(str[i][j][l]!=str[i+1][m][l]){f=0;break;}
				}
				if(!f){
					for(int l=0;l<=i;l++){
						if(str[i][j][l]!=str[i+1][m][l+1]){s=0;break;}
					}
				}
				if(f||s)dp[i][j]+=dp[i+1][m];
				dp[i][j]%=MOD;
			}
		}
	}
	ll ans=0;
	for(int i=0;i<k;i++){ans+=dp[0][i];ans%=MOD;}
	printf("%lld",ans);
}
*/

#include <bits/stdc++.h>
using namespace std;
 
typedef long long ll;
const ll MOD=1000000007;
string str[20][1505];
vector<pair<string,int> > str2[55];
 
int main(){
	int n,k;
	scanf("%d%d",&n,&k);
	char temp[55];
	for(int i=0;i<n;i++){
		for(int j=0;j<k;j++){
			scanf("%s",temp);
			str[i][j]=temp;
		}
		sort(str[i],str[i]+k);
		if(i!=0){
			for(int j=0;j<k;j++){
				string a,b;
				for(int l=0;l<i;l++){
					a+=str[i][j][l];
					b+=str[i][j][l+1];
				}
				if(a==b)str2[i].push_back(make_pair(a,j));
				else str2[i].push_back(make_pair(a,j)),str2[i].push_back(make_pair(b,j));
			}
			sort(str2[i].begin(),str2[i].end());
			//for(int j=0;j<2*k;j++)printf("%s ",str2[i][j].first.c_str());
			//printf("\n");
		}
	}
	ll dp[2][k]; memset(dp,0,sizeof(dp));
	for(int i=0;i<k;i++)dp[1][i]=1;
	for(int i=n-2;i>=0;i--){
		int ptr=0;
		for(int j=0;j<k;j++){
			if(j>0&&str[i][j]==str[i][j-1]){
				dp[0][j]=dp[0][j-1];continue;
			}
			while(ptr<(int)str2[i+1].size()){
				if(str[i][j]==str2[i+1][ptr].first){
					dp[0][j]+=dp[1][str2[i+1][ptr].second];
					dp[0][j]%=MOD;
				}else if(str[i][j]<str2[i+1][ptr].first)break;
				ptr++;
			}
		}
		for(int j=0;j<k;j++){dp[1][j]=dp[0][j];dp[0][j]=0;}
	}
	ll ans=0;
	for(int i=0;i<k;i++){ans+=dp[1][i];ans%=MOD;}
	printf("%lld",ans);
}

Compilation message

trener.cpp: In function 'int main()':
trener.cpp:51:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d%d",&n,&k);
  ~~~~~^~~~~~~~~~~~~~
trener.cpp:55:9: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
    scanf("%s",temp);
    ~~~~~^~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 1280 KB Output is correct
2 Correct 8 ms 1280 KB Output is correct
3 Correct 5 ms 1280 KB Output is correct
4 Correct 6 ms 1280 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Runtime error 10 ms 2988 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 1280 KB Output is correct
2 Correct 8 ms 1280 KB Output is correct
3 Correct 5 ms 1280 KB Output is correct
4 Correct 6 ms 1280 KB Output is correct
5 Runtime error 10 ms 2988 KB Execution killed with signal 11 (could be triggered by violating memory limits)
6 Halted 0 ms 0 KB -