P1019 단어 끝 말 잇 기

1763 단어 알고리즘
제목 설명
단어 끝 말 잇 기 는 우리 가 자주 하 는 성어 끝 말 잇 기 와 비슷 한 게임 이다. 현재 우 리 는 한 개의 단 어 를 알 고 있 으 며 시작 하 는 자 모 를 정 하여 이 자모 로 시작 하 는 가장 긴 '용' (단어 마다 '용' 에 두 번 까지 나타 나 는 것) 을 요구한다. 두 단어 가 연결 되 었 을 때 그 겹 치 는 부분 은 일부분 으로 합 쳐 야 한다. 예 를 들 어 beastbeast 화해시키다 astonishastonish ,용 한 마리 로 연결 되면 beastonishbeastonish ,또한 인접 한 두 부분 에 포함 관계 가 존재 할 수 없다. 예 를 들 어 atat 화해시키다 atideatide 서로 연결 할 수 없다.
입 출력 형식
입력 형식:
 
입력 한 첫 번 째 행동 의 단독 정수 nn ( n \le 20n≤20 )아래 nn 줄 마다 단어 가 있 습 니 다. 입력 한 마지막 행동 은 하나의 문자 로 '용' 으로 시작 하 는 자 모 를 표시 합 니 다. 이 자모 로 시작 하 는 '용' 이 반드시 존재 한다 고 가정 할 수 있 습 니 다.
 
출력 형식:
 
이 자모 로 시작 하 는 가장 긴 '용' 의 길 이 를 출력 하기 만 하면 된다.
 
입 출력 샘플
샘플 입력 \ # 1: 복제 하 다.
5
at
touch
cheat
choose
tact
a

출력 샘플 \ # 1: 복제 하 다.
23
#include 
#include 
#include 
#include 
using namespace std;
int n,use[20],maxlen = 0;
string s[20],c; 
int has_len(string a, string b){
	int len = min(a.length(),b.length());
	for(int i = 1; i < len; i ++){//           1             
		int flag = 1;
		for(int j = 0; j < i; j ++){
			if(a[a.length() - i +j] != b[j])//   -》    
				flag = 0;
		}
		if(flag) return i;//           
	}
	return 0;
}
void link(string str, int l){//dfs 
	maxlen = max(l,maxlen);
	for(int i = 0; i < n; i++)
	{
		if(use[i] >=2 ) continue;
		int k = has_len(str,s[i]);
		if(k > 0){
			use[i] ++;
			link(s[i],s[i].length()+l-k);
			use[i] --;
		}
	}
}
int main() {
	cin >> n;
	for(int i = 0; i < n; i ++){
		cin >> s[i];
	}
	cin >> c;
	link(' '+c,1);
	cout << maxlen;
	return 0;
}

좋은 웹페이지 즐겨찾기